和为s的连续正数序列

输入一个正数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("\n");
32 }
33  

 

 

posted on 2016-06-06 21:53  wxdjss  阅读(130)  评论(0编辑  收藏  举报

导航