标签:style blog class tar ext 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;
}
连续正整数之和(华东师范大学OJ-3025),布布扣,bubuko.com
连续正整数之和(华东师范大学OJ-3025)
标签:style blog class tar ext c
原文地址:http://www.cnblogs.com/yexu200241/p/3720643.html