问题描述:将一个正整数,拆分成连续的自然数之和,输出所有可能的情况

例如: 3 = 1+2

10 = 1+2+3+4

16 = 5+6+7

...

问题求解:

连续的自然数之和让我们想到了等差数列求和公式:

其中Sum为要分解的正整数,n为连续自然数的个数,aFirst为连续自然数的第一位数
将以上公式改写成另外一种格式

求解得到连续自然数个数n:


如果一个数可以分解为几个连续自然数之和,那么就意味着方程有解,那么对于相应的解就有如下限制,

 必须为平方数且开根号的结果必须为奇数
需要注意一点的是:由于是连续自然数,所以首项aFirst必定不可能大于n/2,所以不需要从1-n遍历,只需要从1- n/2 遍历即可

c++代码如下所示

// partitionSum.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <math.h>int main(int argc, char* argv[])
{// 等差数列求和公式 Sum = n*aFirst + n*(n-2)/2;// Sum 为要拆分的整数,// n 为拆分后连续自然数个数// aFirst 为连续自然数中的第一位数int Sum, aFirst;int i,j;int w,k,m;  printf("请输入要分解的自然数Sum: ");scanf("%d",&Sum);  printf("/n");  for(i = 1; i <= Sum/2; i++)  //由于是连续自然数,所以首项必定不可能大于n/2{  aFirst = i;                      w = (2*aFirst-1) * (2*aFirst-1) + 8*Sum;  k = (int)sqrt(w);  m = k - 2*aFirst + 1;  if(k*k != w)  // k是一个平方数continue;  else if(m %2 !=0)  // m必须为偶数continue;  else  {  printf("可以分解%d个连续自然数:/n",m/2);  for(j=1;j<=m/2;j++)  printf("%d ",i+j-1);  printf("/n/n");  }  }  return 0;
}

结果如下图所示:

解法2 ----------------------------------------------------------------------------------------------------------------------------

题目描述:

要求写出所有连续的正整数序列,使其之和等于90,小明灵光一闪,立马写上了29,30,31,

他看到解释说明台式告知答案不止一种,过了好一会,他总算算出了所有的5种答案

给你一个正整数Num,请输出所有连续的递增(+1)的正整数序列,使其之和等于Num,如不存在则输出NULL

例如输入:90

输出:[2,3,4,5,6,7,8,9,10,11,12,13]

[6,7,8,9,10,11,12,13,14]

[16,17,18,19,20]

[21,22,23,24]

[29,30,31]

import java.util.ArrayList;
import java.util.List;
public class Demo5 {public static void main(String[] args) {int number =90;Demo5 demo =new Demo5();demo.printNum(number);}public void printNum(int num) {int sum =0;for (int i =0; i < num /2; i++) {for (int k =1; ; k++) {sum = (k +1) * (2 * i + k) /2;if (sum > num)break;if (sum == num) {List list =new ArrayList();for (int j =0; j <= k; j++) {list.add(i + j);}System.out.println(list);}}}}
}

一个整数拆分为连续自然数之和相关推荐

  1. 整数拆分为连续自然数之和

    闲得蛋疼: 连续自然数之和可以利用等差数列求和公式求得: , N=n*a+n*(n-1)/2: 其中N为需要拆分的整数,n为拆分后连续自然数个数,a为连续自然数中第一位数,比如: 36=11+12+1 ...

  2. 华为OD机试题:整数表达为连续自然数之和

    题目描述: 一个整数可以由连续的自然数之和来表示,给定一个整数,计算该整数有几种连续自然数之和的表达式,并打印出每一种表达式. 输入描述: 一个目标整数t 1<= t <=1000 输出描 ...

  3. HUAWEI 机试题:整数表达为连续自然数之和(Python解法)

    题目描述: 一个整数可以由连续的自然数之和来表示,给定一个整数,计算该整数有几种连续自然数之和的表达式,并打印出每一种表达式. 输入描述: 一个目标整数t 1<= t <=1000 输出描 ...

  4. 分解连续自然数的和_将整数分解为连续自然数之和

    将一个正整数,拆分成连续的自然数之和,输出所有可能的情况 例如: 3 = 1+2 10 = 1+2+3+4 18 = 5+6+7 偶然见到这个问题,这里写下自己的解法. 分析: 对给定整数x以及一组满 ...

  5. HUAWEI 机试题:整数表达为连续自然数之和

  6. 【华为OD机试真题 JAVA】用连续自然数之和来表达整数

    JS版:[华为OD机试真题 JS]用连续自然数之和来表达整数 标题:用连续自然数之和来表达整数 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 一个整数可以由连续的自然数之和来表 ...

  7. 华为OD机试 - 用连续自然数之和来表达整数(Java JS Python)

    题目描述 一个整数可以由连续的自然数之和来表示. 给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式 输入描述 一个目标整数T (1 <=T<= 1000) 输出描述 ...

  8. 【华为OD机试真题 JS】用连续自然数之和来表达整数

    标题:用连续自然数之和来表达整数 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 一个整数可以由连续的自然数之和来表示.给定一个整数,计算该整数有几种连续自然数之和的表达式,且打 ...

  9. 华为od统一考试B卷【用连续自然数之和来表达整数】C++ 实现

              所有题目均有五种语言实现.C实现目录.C++ 实现目录.Python实现目录.Java实现目录.JavaScript实现目录 题目 一个整数可以由连续的自然数之和来表示. 给定一个 ...

最新文章

  1. 「SAP 技术」SAP BP显示供应商账户组时候的怪现象
  2. ASP.NET MVC 4 (九) 模型绑定
  3. ssh-copy-id不生效问题
  4. (软件工程复习核心重点)第三章需求分析-第三节:状态转换图
  5. Error installing bundler:bundler requires Ruby version >= 2.3.0.
  6. android系统开发实验,基于Android智能手机的实验管理系统的设计与实现
  7. oracle mysql增量迁移_从自建Oracle迁移至RDS MySQL
  8. Office 365 On MacOS 系列——配置浏览器账号同时管理多个订阅
  9. 2019互联网公司端午礼盒大PK!
  10. C#静态方法和非静态方法
  11. 处理tiff格式dem数据的方法——输出xyz坐标
  12. 【微积分的本质|笔记】指数函数求导
  13. 美团获得小样本学习榜单FewCLUE第一!Prompt Learning+自训练实战
  14. Akka学习笔记:Actors介绍
  15. 弘辽科技:徒有贵族身份,却连一分钱都没有。
  16. jquery input值发生变化时,时时触发事件 input propertychange 、 cheng
  17. 一分钱不用花,一分钟搭建一个微官网
  18. 如何看懂公司的财务报表(3)
  19. DJ创作舞曲软件介绍
  20. 主流手机CPU及机型介绍

热门文章

  1. HTML中标签对应的英文(方便理解记忆)
  2. 『主动些,你与“开源”才有故事可言』—— 新晋 PMC 成员端正强专访
  3. Windows系统用bat(cmd)实现卡机,死机,蓝屏
  4. 四方支付OEM|个人免签跳转支付|支付宝个人跳转支付|微信个人跳转支付|自动回调跳转
  5. C/C++静态代码检查工具
  6. java实时数据抽取_试用Web-HarvestJava开源Web数据抽取...
  7. 角谱法 matlab,一种基于部分角谱法的快速全息图生成和高质量再现方法与流程...
  8. 严格对角化(Exact diagonalization)介绍
  9. 一张图看懂SharpCapture
  10. python好看的流星雨代码,python流星雨代码解释