您的位置:首页 > 其它

百度之星05-01【连续正整数】

2012-05-17 23:36 211 查看
/************************************************************************
连续正整数(  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
评分标准:程序输出结果是否正确。
************************************************************************/

/************************************************************************
思路:
num=x+...+y     (x<y)
=>    num=(1+...+y)-(1+...+x-1)
=>    num=y*(y+1)/2-(x-1)*x/2=(y+x)(y-x+1)/2
=>    2*num=(y+x)*(y-x+1)
=>    设2*num=a*b
=>    y=(a+b-1)/2
x=(a-b+1)/2
************************************************************************/

#include <stdio.h>
#include <math.h>

int main()
{
int num,dnum,a,b,x,y;
int i=0,n=0,j=0,flag=0;

while(1){
flag=0;
printf("请输入一个正整数:");
scanf("%d",&num);
dnum=2*num;
n=(int)( sqrt((float)(dnum)) );
/************************************************************************/
//找出所有2*num=a*b的形式
for(i=n;i>=1;i--){
if(dnum%i==0){//可以整除
b=i;
a=dnum/i;
if( a>b && (a+b-1)%2==0 && (a-b+1)%2==0 ){
x=(a-b+1)/2;
y=(a+b-1)/2;
if(x<y){
for(j=x;j<=y;j++){
printf("%d ",j);
}
printf("\n");
flag=1;
}
}
}
}
if(flag==0)printf("NONE\n");
}
/************************************************************************/
return 0;
}


vc6下编译通过,算法核心就是找出2*num的所有a*b相乘的情形,然后通过a和b可以得到x与y
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: