1. 描述
输入一个正整数n,输出所有和为n的连续正整数序列。
例如输入15,输出4个序列:1 2 3 4 5,4 5 6, 7 8, 15
据说这是一道网易的面试题。
2. 思路
用start和end分别表示序列的起始和结束,sum为从start到end序列的和。end的值不大于(n+1)/2。开始时令sum = start = end = 0,判断sum的值是否等于n:
(1) 如果等于n,则打印从start到end之间的序列,并令sum += ++end;
(2) 如果sum 小于n,则令sum += ++end;
(3) 此时sum大于n,令sum -= start++;
代码如下:
void continuousSeqSum(int n)
{
if (n <= 0)
return ;
int sum, start, end, i;
sum = start = end = 1;
while (end <= (n + 1) >> 1)
{
if (sum == n)
{
for (i = start; i <= end; i++) //打印结果
printf("%d ", i);
printf("\n");
sum += ++end;
} else if (sum < n)
{
sum += ++end;
} else
{
sum -= start++;
}
} //while
if (n > 1)
printf("%d\n", n);
}
测试如下:
#include <stdio.h>
void continuousSeqSum(int n);
int main(void)
{
int n;
printf("input n: ");
scanf("%d", &n);
continuousSeqSum(n);
return 0;
}
输出: