题目:输入一个正数S,打印出所有和为S的连续的正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续的序列1-5、4-6、7-8
分析:由于有了面试题(4)的经验,我们也考虑用两个数small和big来标示序列的最大值和最小值。首先把small初始化为1,big初始化为2,如果从small到big的和大于S,我们可以从序列中去掉较小的值,如果从small到big的值小于S,我们可以考虑增大big的值,让这个序列包含更多的数字,因为序列最少要有两个数字,我们一直增加small到(1+s)/2为止。
参考代码如下:
#include <stdio.h>
#include <stdlib.h>
//打印出序列
void printSequence(int small,int big)
{
int i;
for(i=small;i<=big;i++)
{
printf("%d ",i);
}
printf("\n");
}
//找出和为s的连续正数序列
void findContinousSequence(int sum)
{
if(sum < 3)
return;
int small = 1;
int big = 2;
int middle = (1 + sum) / 2;
int currentSum = small + big;
while(small < middle)
{
if(currentSum == sum)
printSequence(small,big);
while(currentSum > sum && small <middle)
{
currentSum -= small;
small++;
if(currentSum == sum)
printSequence(small,big);
}
big++;
currentSum += big;
}
}
int main()
{
int s;
scanf("%d",&s);
findContinousSequence(s);
return 0;
}