连续整数和问题
问题描述:
大部分正整数可以表示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,还可以输出所有解。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n",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\n",ans); 33 } 34 return 0; 35 }
通过编程实验发现,除了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个自然数之和。