题目一:输入一个递增排序的数组和一个数字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"); }
时间: 2024-12-06 06:12:24