Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12257
  • 博文数量: 3
  • 博客积分: 160
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-08 12:32
文章分类
文章存档

2011年(1)

2008年(2)

我的朋友
最近访客

分类: C/C++

2008-06-01 21:46:30

2005年百度之星程序设计大赛试题初赛题目

第一题(共四题 100 分):连续正整数( 10 分)

题目描述:一个正整数有可能可以被表示为 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

评分标准:程序输出结果是否正确。

分析:

 

n(1+n)/2 <= m (设n最大的值为max) 

max = (int) sqrt( m ) * sqrt( 2 ) 

start = m / n – (n – 1)/2 是否为整数?

如果是整数,就符合条件,end = start + n,显示 start à end

 

 

#include<math.h>
main(){
  int flag = 0,max;            

  //max 表示拆分后的最多个数
  //flag为0或1 (0 表示无符合条件的序列存在,1表示有)

  long m,start,end;            

  //m 表示要处理的输入数据
  //start 表示要显示的开始数字
  //end 表示要显示的结束数据

  float temp;                //临时变量

  scanf("%ld",&m);            //输入要处理的数据

  max = (int)(sqrt(m)*sqrt(2));

  //计算 最多由多少个连续的数相加等于 m

  for(;max >= 2;max--){
    temp = (float)m/max - (float)(max-1)/2;

    //计算开始的数字是否为整数

    if(temp == (int)temp){    //判断是否为整数

      flag = 1;         //置标志为1,表示输入的数据有符合条件的序列存在

      start = temp;            //置要显示的开始正整数

      end = start + max;        //置要显示的结束正整数

      for(;start < end;start++)    //显示由 start 到 end 的连续正整数

        printf("%ld ",start);
      printf("\n");
    }
  }
  if(flag == 0)    //判断处理的数据是否有符合条件的序列存在

    printf("NONE\n");    //没有符合条件的序列存在,输出NONE

}

文件: 2005年百度之星程序设计大赛试题初赛题目(第一题参考答案).rar
大小: 6KB
下载: 下载

阅读(872) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

xj551882008-06-01 22:12:24

自己做的,大家多交流。有不足的地方请指正。。