题目一:输入一个递增排序的数组和一个数字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<middle)
{
if(curSum==sum)
PrintCountinuousSequence(small,big);
while(curSum>sum&&small<middle)
{
curSum-=small;
small++;
if(curSum==sum)
PrintCountinuousSequence(small,big);
}
big++;
curSum+=big;
}
}
void PrintContinuousSequence(int small,int big)
{
for(int i=small;i<=big;++i)
printf("%d ",i);
printf("\n");
}
转载于:https://blog.51cto.com/secondscript/1588074