把整数分解为连续整数之和

把整数分解为连续整数之和(转)

http://student.csdn.net/space.php?uid=32341&do=blog&id=1716

 1 #include  < stdio.h >     
 2 int  main( void )    
 3 {    
 4    int n, nSum=1;// nSum 保存总和    
 5    scanf("%d"&n);// 输入要分解的n    
 6    for(int n1=1, n2=n1; n1<=n/2; )// n1为最开头的数,n2是最末尾    
 7    {    
 8        if(nSum<n)      //总和偏小    
 9        {    
10            n2++;       //末尾加数    
11            nSum+=n2;    
12        }
    
13        else if(nSum>n) //总和偏大    
14        {    
15            nSum -= n1; //开头删数    
16            n1++;    
17        }
    
18        else //if(nSum==n) //相等就输出结果    
19        {    
20            for(int t=n1; t<=n2; t++)    
21            {    
22                printf("%d,", t);    
23            }
    
24            printf("\n");    
25            n2++;       //末尾加数,如果不加就会死循环    
26            nSum+=n2;   //这步要小心    
27        }
    
28    }
    
29    return 0;    
30}
    
31

问题:还有更快的办法吗?请仔细观察第一段代码,看得出哪个特点可以利用不?

关键就在那个通项公式,(n1+n2)*(n2-n1+1) == n*2
这里如果先把n乘以2,然后的问题可不可以看成是因子分解?答案很明显。
假如分解出的结果是n*2 = a*b ,
那就解方程组 n1+n2=a, n2-n1+1=b
即n1=(a-b+1)/2, n2=(a+b-1)/2
如果解出的结果n1和n2是整数的话(即要使a和b一奇一偶),显然就得到一组解了
而因子分解的复杂度是O(sqrt(n)),显示会比之前第二段代码要节省非常多的时间。

你可能感兴趣的:(把整数分解为连续整数之和)