2005百度之星竞赛题1

作者在 2007-05-15 07:55:00 发布以下内容
一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。

输入数据:一个正整数,以命令行参数的形式提供给程序。
输出数据:
在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出“NONE”。
例如,对于15,其输出结果是:
1 2 3 4 5
4 5 6
7 8
对于16,其输出结果是:
NONE
评分标准:
程序输出结果是否正确。

经典程序 | 阅读 2139 次
文章评论,共3条
ecbtnrt(作者)
2007-05-15 07:57
1
#i nclude <stdio.h>

int main(void)
{
 int num;
 int i, j, k, flag = 0;
 int old = 0;
 printf("please input a integer:");
 scanf("%d", &num);

 for (j = 1; j < num; j++)
 {
  for (i = j; i < num; i++)
  {
   old += i;
   if (num == old)
   {
    printf("%d = ", num);
    for (k = i; k > j; k--)
     printf("%d + ", k);
    printf("%d", k);
    printf("\n");
    flag = 1;    
   }
  }
  old = 0;
 }

 if (flag == 0)
 {
  printf("%d cannot!\n", num);
 }

 return 0;
}

ecbtnrt(作者)
2007-05-16 04:01
2
这题是送分的题,考会不会写程序了,很基本的。采用从1循环,的确是比较简单,但是时间复杂度为o(n^3),很浪费资源,有比较简单的算法,有过有的话告诉我吧!
ecbtnrt(作者)
2007-05-16 04:35
3
#include    <iostream.h>

int main()
{
    int num;
    int i,j,k,flag = 0;
    int old = 0;
    cout << "please input a integer:  " ;
    cin >> num;

    for(j = 1; j < num; j++)
    {
        for(i = j; i < num; i++)
        {
            old += i;
            if(num == old)
            {
                for(k = j; k <= i; k ++)
                    cout << k << ' ';
                    cout << endl;
                flag = 1;
            }
        }
        old = 0;
    }
    if(flag == 0)
        cout << "NONE" << endl;
    
    return 0;
}
游客请输入验证码
浏览108199次