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

例如: 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. php中RGB转十六进制、十六进制转RGB
  2. 【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )
  3. boost::topological_sort用法的测试程序
  4. char data[0]在struct末尾的用法
  5. apache spark_如何将自定义数据源集成到Apache Spark中
  6. LeetCode:位运算实现加法
  7. ACM常用C++模板 包括常用头文件
  8. django 各种包的集合网站
  9. ubuntu两个conda安装和切换
  10. pytorch_GPU安装
  11. 力扣-543. 二叉树的直径
  12. WPF 使用附加属性增加控件属性
  13. vue对于ntko的应用经验
  14. 元启发式算法之一:蝙蝠算法BA
  15. eXosip订阅问题分析
  16. SDL Trados2017及SDL MultiTerm安装
  17. 在CAD中修改标注箭头端样式需要怎么操作?
  18. 第三阶段应用层——1.7 数码相册—电子书(3)—轮询方式支持多输入
  19. 幻灯片更换模板_如何创建Google幻灯片模板
  20. 鼓励你大胆追梦的三个移动互联网案例

热门文章

  1. 快捷键创建向下滑动关机小技巧~~
  2. QT大作业——自制小游戏
  3. php中mb_str_split分割字符串为数组的函数介绍与使用以及低版本php函数实现
  4. 什么是脚本 解释性语言?
  5. 一段通过java 得到svn log 然后过滤一些文字, 最后打印出来的shell
  6. 开源的分布式数据库中间件系统Mycat和阿里巴巴Cobar的对比
  7. 如何运用python爬游戏皮肤_教你Python 爬取某荣耀全套皮肤
  8. 推荐 10 个 GitHub 上最火的程序员简历项目,少说加薪 3K 的简历技巧!
  9. linux获取usb键盘、扫描枪输入数据
  10. 专业影像编辑软件Vegas pro17注册机下载安装