连续整数和问题
2013-11-05 21:42
260 查看
问题描述:
大部分正整数可以表示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,还可以输出所有解。
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个自然数之和。
大部分正整数可以表示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,还可以输出所有解。
#include<stdio.h> #include<math.h> int ans=0; void find(int x) { int i,a; for(i=2;i<=sqrt(x*2+0.25)-0.5;i++) { if((x-(i*(i-1))/2)%i==0) { ans++; a=(x-(i*(i-1))/2)/i; printf("%d=",x); for(int j=0;j<i;j++) { if(j<i-1) printf("%d+",a+j); else printf("%d\n",a+j); } } } } int main() { int n; while(scanf("%d",&n)!=EOF) { ans=0; find(n); printf("total=%d\n",ans); } return 0; }
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个自然数之和。
相关文章推荐
- 三元顺序表基本加法以及减法
- linux下core文件调试方法
- UML
- JavaScript-1
- C++设计模式之六--Facade门面模式
- MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)
- [MySQL 工具]percona-toolkit使用(1)源码安装
- 软件工程之五个层次四个部分
- BIOS和CMOS区别
- MongoDB在Linux下的安装及自动分片
- Please ensure that adb is correctly located at问题解决
- 编程常识
- C++基础(1)
- Ubuntu 常用命令
- 用STS创建Maven的Web项目
- Gray Code
- 每日英语:Patent Wars Erupt Again in Tech Sector
- KVM内核之内存管理(串讲PPT)
- Linux网络编程入门 (转载)
- Oracle expdp 时遭遇ORA-39125 ORA-04063