题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

分析:选择数组的两端,将其相加,然后与s比较,如果比s大,则将指向数组最后的向前移一位,如果小于s,则指向数组的第一位的向后移一位,然后继续这个过程。如果等于s,则输出这两个数。

实现:

bool FindNumbersWithSum(int data[],int length,int sum,int* num1,int* num2){    bool found=false;    if(length<1||num1==NULL||num2==NULL)        return found;        int ahead=length-1;    int behind=0;        while(ahead>behind)    {        long long curSum=data[ahead]+data[behind];        if(curSUm==sum)        {            *num1=data[behind];            *num2=data[ahead];            found=true;            break;        }        else if(curSum>sum)            ahead--;        else            behind++;    }    return found;}

题目二:输入一个正数s,打印出所有和为s的连续正数序列(至少两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5,4~6,7~8。

分析:设置两个数来表示序列的最小和最大值small和big,small为1,big为2,当small到big之间的序列和小于s时,big+1,如果大于s,则small+1,然后继续。如果相等,则输出序列。循环停止的条件是small增加到(1+s)/2. 实现:

void FindContinuousSequence(int sum){    if(sum<3)        return;            int samll=1;    int big=2;    int middle=(1+sum)/2;    int curSum=small+big;        while(small
sum&&small
<=big;++i)        printf("%d  ",i);            printf("\n");}