连续整数和问题

问题描述:

           大部分正整数可以表示2个以上连续整数之和。如:6=1+2+3,9=5+4=2+3+4;

实验任务:

       连续整数和问题要求计算给定的正整数可以表示为多少个2以上连续整数之和。

解题过程:

一个数M若可以写成以a开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+…+(a+n-1)=n*a+n*(n-1)/2,要求a>=1,否则就是以a+1开头的连续n-1个整数了,也就是要求(M-(n*(n-1)/2))除于n大于等于1,(M-(n*(n+1)/2))%n==0,这样就很容易判断一个数可不可以写成连续n个自然数的形式了,遍历n=2…sqrt(2*M+0.25)-0.5,还可以输出所有解。

  

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int ans=0;
 5 void find(int x)
 6 {
 7     int i,a;
 8     for(i=2;i<=sqrt(x*2+0.25)-0.5;i++)
 9     {
10         if((x-(i*(i-1))/2)%i==0)
11         {
12             ans++;
13             a=(x-(i*(i-1))/2)/i;
14             printf("%d=",x);
15             for(int j=0;j<i;j++)
16             {
17                 if(j<i-1)
18                     printf("%d+",a+j);
19                 else
20                     printf("%d
",a+j);
21             }
22         }
23     }
24 }
25 int main()
26 {
27     int n;
28     while(scanf("%d",&n)!=EOF)
29     {
30         ans=0;
31         find(n);
32         printf("total=%d
",ans);
33     }
34     return 0;
35 }
View Code

通过编程实验发现,除了2^n以外,其余所有数都可以写成该形式。下面说明为什么。
若数M符合条件,则有M=a+(a+1)+(a+2)+…+(a+n-1)=(2*a+n-1)*n/2,而2*a+n-1与n肯定一个为奇数一个为偶数,即M一定要有一个奇数因子,而所有2^n都没有奇数因子,因此肯定不符合条件。

可以证明,只要M有一个奇数因子,就一定可以写成连续n个自然数之和。

      

原文地址:https://www.cnblogs.com/zeze/p/zhenshuhe.html