输入一个正数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,我们可以从序列中去掉较小的值,也就是增大small的值。如果从small到big的序列的和小于s,我们可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small到(1+s)/2为止。
参考代码:
1 void FindCoutinuousSequence(int sum) 2 { 3 if(sum<3) 4 return; 5 int small=1; 6 int big=2; 7 int middle=(1+sum)/2; 8 int curSum=small+big; 9 while(small<middle) 10 { 11 if(curSum==sum) 12 PrintContinuousSequence(small,big); 13 14 while(curSum>sum&&small<middle) 15 { 16 curSum -=small; 17 small++; 18 19 if(curSum==sum) 20 PrintContinuousSequence(small,big); 21 } 22 big++; 23 curSum +=big; 24 } 25 } 26 27 void PrintContinusSequence(int small,int big) 28 { 29 for(int i=small;i<=big;++i) 30 printf("%d",i); 31 printf(" "); 32 } 33