1 /************************************************************************ 2 连续正整数( 10 分) 3 题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如: 4 15=1+2+3+4+5 5 15=4+5+6 6 15=7+8 7 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。 8 输入数据:一个正整数,以命令行参数的形式提供给程序。 9 输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的 10 最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大 11 打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出 12 “NONE” 。 13 例如,对于 15 ,其输出结果是: 14 1 2 3 4 5 15 4 5 6 16 7 8 17 对于 16 ,其输出结果是: 18 NONE 19 评分标准:程序输出结果是否正确。 20 ************************************************************************/ 21 22 /************************************************************************ 23 思路: 24 num=x+...+y (x<y) 25 => num=(1+...+y)-(1+...+x-1) 26 => num=y*(y+1)/2-(x-1)*x/2=(y+x)(y-x+1)/2 27 => 2*num=(y+x)*(y-x+1) 28 => 设2*num=a*b 29 => y=(a+b-1)/2 30 x=(a-b+1)/2 31 ************************************************************************/ 32 33 #include <stdio.h> 34 #include <math.h> 35 36 int main() 37 { 38 int num,dnum,a,b,x,y; 39 int i=0,n=0,j=0,flag=0; 40 41 while(1){ 42 flag=0; 43 printf("请输入一个正整数:"); 44 scanf("%d",&num); 45 dnum=2*num; 46 n=(int)( sqrt((float)(dnum)) ); 47 /************************************************************************/ 48 //找出所有2*num=a*b的形式 49 for(i=n;i>=1;i--){ 50 if(dnum%i==0){//可以整除 51 b=i; 52 a=dnum/i; 53 if( a>b && (a+b-1)%2==0 && (a-b+1)%2==0 ){ 54 x=(a-b+1)/2; 55 y=(a+b-1)/2; 56 if(x<y){ 57 for(j=x;j<=y;j++){ 58 printf("%d ",j); 59 } 60 printf("\n"); 61 flag=1; 62 } 63 } 64 } 65 } 66 if(flag==0)printf("NONE\n"); 67 } 68 /************************************************************************/ 69 return 0; 70 }
vc6下编译通过,算法核心就是找出2*num的所有a*b相乘的情形,然后通过a和b可以得到x与y