大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C技巧 > C语言实现连续正整数之和

C语言实现连续正整数之和

关键词:C语言连续正整数连续正整数之和  阅读(890) 赞(17)

[摘要]本文是对连续正整数之和(华东师范大学OJ-3025)的讲解,对学习C编程技术有所帮助,与大家分享。

题目描述:一个正整数有可能可以被表示为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 to end
 程序实现:
 #include <stdio.h>
 #include <math.h>
  int main()
  { int m=0,n=0,start=0,end=0,flag=0; //m为输入的数,n为正整数序列个数,start为显示的开始正整数,end为显示的结束正整数,flag表示有无符合条件的序列存在,
  //0(默认)没有,1有
  float temp=0.0;
  printf("please input a Integer:");
  scanf("%d",&m);
  printf("/n");
  n=(int) (sqrt(m)*sqrt(2)); //求出可能的最大的序列个数
  while(n>=2)
  { temp=(float)m/n-(float)(n-1)/2; //求开始数
  if(temp==(int) temp){ //判断是不是正整数,即有没有符合符合条件的序列存在
  for(flag=1,start=(int) temp,end=start+n;start<end;start++) { //flag标志置1,有符合符合条件的序列存在,得出开始整数start和结束整数end
   printf("%d",start); printf(" "); }
   printf("/n");
   }
   n--;
   }
   if(flag==0) //没有符合符合条件的序列存在,则输出"none"
   printf("none");
  return 0;
}



相关评论