题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。

一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:

15=1+2+3+4+5

15=4+5+6

15=7+8

有些数可以写成连续N(>1)个自然数之和,比如14=2+3+4+5;有些不能,比如8.那么如何判断一个数是否可以写成连续N个自然数之和呢?

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

void divide(int num)

{

int i,j,a;

for(i=2; i<=sqrt((float)num)*2; ++i)

{

if((num-i*(i-1)/2)%i==0)

{

a=(num-i*(i-1)/2)/i;

if(a>0)

{

for(j=0; j

cout<

}

cout<

}

}

}

第二个问题是什么样的数可以写成连续n个自然数之和,什么样的数不能?

通过编程实验发现,除了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有一个奇数因子,即M!=2^n,M就可以写成连续n个自然数之和。假设M有一个奇数因子a,则M=a*b。

若b也是奇数,只要b-(a-1)/2>0,M就可以写成以b-(a-1)/2开头的连续a个自然数;将这条结论里的a和b调换,仍然成立。15=3*5=1+2+3+4+5=4+5+6.

若b是偶数,则我们有一个奇数a和一个偶数b。

2.1 若b-(a-1)/2>0,M就可以写成以b-(a-1)/2开头的连续a个自然数。24=3*8=7+8+9.

2.2 若(a+1)/2-b>0,M就可以写成以(a+1)/2-b开头的连续2*b个自然数。38=19*2=8+9+10+11.

上述两个不等式必然至少有一个成立,所以可以证明,只要M有一个奇数因子,就一定可以写成连续n个自然数之和。

另一个正整数分解的算法:

sum(i,j)为i累加到j的和

令 i=1 j=2

if sum(i,j)>N i++

else if sum(i,j)

else cout i...j

参考代码:

#include

using namespace std;

int add(int m,int n)

{

int sum=0;

for(int i=m;i<=n;i++)

sum+=i;

return sum;

}

void divide(int num)

{

int i=1,j=2,flag;

int sum=0;

while(i<=num/2)

{

sum=add(i,j);

while(sum!=num)

{

if(sum>num)

i++;

else

j++;

sum=add(i,j);

}

for(int k=i;k<=j;k++)

cout<

++i;

cout<

}

}

int main()

{

int num;

cout<

cin>>num;

divide(num);

return 0;

}

本文同步分享在 博客“shiter”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

分解连续自然数的和_【编程练习】正整数分解为几个连续自然数之和相关推荐

  1. Python编程之正整数分解

    问题描述:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因 ...

  2. 【编程练习】正整数分解为几个连续自然数之和

    题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...

  3. 分解连续自然数的和_[算法]正整数分解为几个连续自然数之和

    题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...

  4. 分解连续自然数的和_正整数分解为几个连续自然数之和

    题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...

  5. 分解连续自然数的和_正整数分解为几个连续自然数之和-阿里云开发者社区

    题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...

  6. 正整数分解为几个连续自然数之和

    题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 ...

  7. 编程将一个整数分解成一个质因数的连乘积,并打印在屏幕上

    //编程将一个整数分解成一个质因数的连乘积,并打印在屏幕上 //***本题的难点是既要找出质因数,又要保证其连乘为该数 //***需要两个循环,外循环与内循环 /*每个合数 都可以写成几个 质数 相乘 ...

  8. 连续潮流的理论与编程

    Index 连续潮流的理论简介及其编程 1. 问题背景与连续潮流的基础 1.1 问题背景 1.2 连续潮流的基本原理与分类 2. 连续潮流的数学模型:引入参数的潮流方程 3. 连续潮流的主要步骤及程序 ...

  9. java字符串逐个分解_改进JAVA字符串分解的方法

    改进JAVA字符串分解的方法 一.概述 大多数Java程序员都曾经使用过java.util.StringTokenizer类.它是一个很方便的字符串分解器,主要用来根据分隔符把字符串分割成标记(Tok ...

最新文章

  1. Visual Studio Code为什么能这么牛X?
  2. 微软收购社交监控分析公司Netbreeze
  3. 20165201 实验五 网络编程与安全
  4. apache kafka源码分析-Producer分析---转载
  5. 66.javac 编译与 JIT 编译\编译过程\javac 编译\词法、语法分析\填充符号表\语义分析\字节码生成\JIT 编译
  6. 使用Redis bitmaps进行快速、简单、实时统计
  7. 用NSubstitute来mock
  8. php memcached 队列,redis获取所有队列_memcached
  9. tt服务器系统,tt服务器
  10. 自己在项目中写的一个Jquery插件和Jquery tab 功能
  11. IDM下载器最新版本6.32.7
  12. 51单片机外围模块——红外通信
  13. Misumi米思米数据线驱动无法安装
  14. oracle与sun的java_甲骨文吞Sun Java何去何从?
  15. SpringMVC简介及第一个MVC程序
  16. echart旭日图_ECharts 旭日图
  17. 云游戏深度报告:中国云游戏商业模式在哪里?
  18. 成本低廉的深度学习与渲染显卡购买方案--英伟达矿卡P106
  19. 一文读懂区块链与大数据的关系
  20. 手把手教你使用Java生成助记词、私钥、地址|Java区块链钱包生成助记词、地址

热门文章

  1. 游戏开发基础笔记:逻辑帧和物理帧辨析 | Gameloop | 游戏循环
  2. php代码静态检查工具,代码静态检查工具汇总
  3. element-ui中tree连动
  4. 计算机应用研究 相对好发一些,传感技术学报期刊好投吗_机械科学与技术录用率高吗_计算机工程与应用被拒还能再投吗...
  5. DIY强大的虚拟化环境-前言与目录
  6. 图像旋转(image_rotation) (15 分)
  7. 记一次磁盘修复--error - read only 0 of 512 bytes
  8. 会计学原理学习笔记——第二章——账户设置与借贷记账法(2.5会计科目)
  9. 【平民系列教程】强悍的杀毒辅助软件Wsyscheck—没用过包你肠子都悔青了
  10. vi替换字符串(zz)