一个整数拆分为连续自然数之和
问题描述:将一个正整数,拆分成连续的自然数之和,输出所有可能的情况
例如: 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);}}}}
}
一个整数拆分为连续自然数之和相关推荐
- 整数拆分为连续自然数之和
闲得蛋疼: 连续自然数之和可以利用等差数列求和公式求得: , N=n*a+n*(n-1)/2: 其中N为需要拆分的整数,n为拆分后连续自然数个数,a为连续自然数中第一位数,比如: 36=11+12+1 ...
- 华为OD机试题:整数表达为连续自然数之和
题目描述: 一个整数可以由连续的自然数之和来表示,给定一个整数,计算该整数有几种连续自然数之和的表达式,并打印出每一种表达式. 输入描述: 一个目标整数t 1<= t <=1000 输出描 ...
- HUAWEI 机试题:整数表达为连续自然数之和(Python解法)
题目描述: 一个整数可以由连续的自然数之和来表示,给定一个整数,计算该整数有几种连续自然数之和的表达式,并打印出每一种表达式. 输入描述: 一个目标整数t 1<= t <=1000 输出描 ...
- 分解连续自然数的和_将整数分解为连续自然数之和
将一个正整数,拆分成连续的自然数之和,输出所有可能的情况 例如: 3 = 1+2 10 = 1+2+3+4 18 = 5+6+7 偶然见到这个问题,这里写下自己的解法. 分析: 对给定整数x以及一组满 ...
- HUAWEI 机试题:整数表达为连续自然数之和
- 【华为OD机试真题 JAVA】用连续自然数之和来表达整数
JS版:[华为OD机试真题 JS]用连续自然数之和来表达整数 标题:用连续自然数之和来表达整数 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 一个整数可以由连续的自然数之和来表 ...
- 华为OD机试 - 用连续自然数之和来表达整数(Java JS Python)
题目描述 一个整数可以由连续的自然数之和来表示. 给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式 输入描述 一个目标整数T (1 <=T<= 1000) 输出描述 ...
- 【华为OD机试真题 JS】用连续自然数之和来表达整数
标题:用连续自然数之和来表达整数 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 一个整数可以由连续的自然数之和来表示.给定一个整数,计算该整数有几种连续自然数之和的表达式,且打 ...
- 华为od统一考试B卷【用连续自然数之和来表达整数】C++ 实现
所有题目均有五种语言实现.C实现目录.C++ 实现目录.Python实现目录.Java实现目录.JavaScript实现目录 题目 一个整数可以由连续的自然数之和来表示. 给定一个 ...
最新文章
- php中RGB转十六进制、十六进制转RGB
- 【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )
- boost::topological_sort用法的测试程序
- char data[0]在struct末尾的用法
- apache spark_如何将自定义数据源集成到Apache Spark中
- LeetCode:位运算实现加法
- ACM常用C++模板 包括常用头文件
- django 各种包的集合网站
- ubuntu两个conda安装和切换
- pytorch_GPU安装
- 力扣-543. 二叉树的直径
- WPF 使用附加属性增加控件属性
- vue对于ntko的应用经验
- 元启发式算法之一:蝙蝠算法BA
- eXosip订阅问题分析
- SDL Trados2017及SDL MultiTerm安装
- 在CAD中修改标注箭头端样式需要怎么操作?
- 第三阶段应用层——1.7 数码相册—电子书(3)—轮询方式支持多输入
- 幻灯片更换模板_如何创建Google幻灯片模板
- 鼓励你大胆追梦的三个移动互联网案例
热门文章
- 快捷键创建向下滑动关机小技巧~~
- QT大作业——自制小游戏
- php中mb_str_split分割字符串为数组的函数介绍与使用以及低版本php函数实现
- 什么是脚本 解释性语言?
- 一段通过java 得到svn log 然后过滤一些文字, 最后打印出来的shell
- 开源的分布式数据库中间件系统Mycat和阿里巴巴Cobar的对比
- 如何运用python爬游戏皮肤_教你Python 爬取某荣耀全套皮肤
- 推荐 10 个 GitHub 上最火的程序员简历项目,少说加薪 3K 的简历技巧!
- linux获取usb键盘、扫描枪输入数据
- 专业影像编辑软件Vegas pro17注册机下载安装