文章目录
//数组已经排好序,假设升序。
//当给定和为S,返回数组中两个数使得他们和为s


#include <iostream>

using namespace std;
//找到排序数组和为S的两个数
//void FindNumbersWithSum(int *data,int length,int s){
//    bool flag=false;
//    if(data==NULL ||length<1)
//        return;
//    int ahead=0;
//    int behind=length-1;
//    while(ahead<behind){
//        if(data[ahead]+data[behind]==s){
//            flag=true;
//            break;//找到就跳出循环,不然就死了
//        }
//        else if(data[ahead]+data[behind]>s)
//            behind--;
//        else
//            ahead++;
//    }
//    if(flag){
//        cout<<data[ahead]<<" "<<data[behind];
//    }
//    else
//        cout<<"not found"<<endl;
//}
//************拓展*********************************8
//找到连续正数序列(1,2,3.。。。。S)中和为S的序列,打印出来,至少为3
void PrintContinueSequence(int small, int big){
    for(int i=small;i<=big;i++)
        cout<<i<<" ";
    cout<<endl;
}
void FindContinueSequence(int sum){
    if(sum<3)
        return ;
    int small=1;
    int big=2;
    int mid=(sum+1)/2;//因为是递增,所以最小的数不可能超过中间值
    int curSum=small+big;
    while(small<mid){
        if(curSum==sum){
            PrintContinueSequence(small,big);
        }
        while(curSum>sum && small<mid){
            curSum-=small;//先减去已经在里面的小的数值
            small++;

            if(curSum==sum)
                PrintContinueSequence(small,big);
        }
        big++;
        curSum+=big;//后加上不在里面的大的数值
    }
}
int main()
{
//    int data[]={1,2,3,7,11,15};
//    FindNumbersWithSum(data,6,1);
      FindContinueSequence(13);
    return 0;
}
文章目录