代码改变世界

算法100题51

2011-09-18 23:23  justvi  阅读(168)  评论(2编辑  收藏  举报

/* 题目来自:http://blog.csdn.net/v_JULY_v

 * 题51:输入一个正数n,输出所有和为n连续正数序列。

 * 例如输入15,输出三个连续序列1-5,4-6和7-8

 * 方法:首先可以判断这样的序列一定出现在序列1...n的前半部分,可以通过两次循环求和,看和是否与n相等来确定序列的开头和结尾。

 * 有无更好方法?

 */

 1 #include <stdio.h>
2
3 void func(int n)
4 {
5 int i, j, result;
6 for (i = 1; i <= n / 2; i++)
7 {
8 result = i;
9 for (j = i + 1; j <= n/2+1; j++)
10 {
11 result += j;
12 if (result == n)
13 {
14 printf("%d-%d\n", i, j);
15 continue;
16 }
17 }
18 }
19 }
20
21 int main()
22 {
23 func(18);
24 return 0;
25 }

  输出:3-6,5-7

方法2:按照诺贝尔的想法,得到func2如下:

 1 void func2(int n)
2 {
3 int i = 1;
4 int j = 2;
5 int sum = i + j;
6 while (i != j)
7 {
8 if (sum > n)
9 {
10 sum -= i;
11 i++;
12 }
13 else if (sum < n)
14 {
15 j++;
16 sum += j;
17 }
18 else
19 {
20 printf("%d-%d\n", i, j);
21 j++;
22 sum += j;
23 }
24 }
25 }

  可见此种方法比第一种巧妙