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

 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

posted @ 2012-05-17 23:36  小二来壶酒  阅读(302)  评论(0编辑  收藏  举报