题目:输入一个正数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到big的序列和等于s | 打印small到big的序列 |
因为序列至少包含两个数字,因此循环条件为small增加到(s+1)/2为止。
核心代码如下:
void PrintContinuousSequence(int small, int big);
void FindContinuousSequence(int sum){
if(sum < 3)
return;
int small = 1;
int big = 2;
int middle = (sum + 1) / 2;
int curSum = small + big;
while(small < middle){
if(curSum == sum)
PrintContinuousSequence(small, big);
//如果从small到big的序列和大于sum,则从序列中去掉较小的值
while(curSum > sum && small < middle){
curSum -= small;
small++;
if(curSum == sum)
PrintContinuousSequence(small, big);
}
//当curSum < sum时,增大big,让这个序列包含更多的数字
big++;
curSum += big;
}
}
void PrintContinuousSequence(int small, int big){
for(int i = small; i <= big; i++)
cout << i;
cout << endl;
}