java表示自然数,将一个正整数表示为连续自然数的和
将一个正整数表示为连续自然数的和
将一个正整数表示为连续自然数的和,比如给定整数15,那么根据题意,需要输出的连续自然数为1+2+3+4+5=4+5+6=7+8=15。题目中的连续自然数序列可以看做一个升序的有序数组,取数组前两个数为起始的区间的左右两个端点。对区间中的值进行累加,如果累加值小于给定的整数时,那么右端点向右移动,添加下一个数字,如果累加值大于给定的整数时,那么左端点向右移动,表示去掉最左端的最小值,如果值与给定整数相等,那么输出后,需要重新对定区间左右两个端点赋值,直到左端点的值小于 (number+1)/2。代码如下:
复制代码
1 void printContinuous(int begin, int end, int value)
2 {
3 for(int i=begin; i!=end; i++)
4 cout<
5 cout<
6 }
7
8 void findContinuous(int n)
9 {
10 int begin=1, end = 2; //begin和end分别代表和为n的连续正数的区间
11 int middle = (n+1)/2; //middle表示n的中间数,middle*2 >= n,所以控制begin
12 int sum = begin+end;
13
14 while(begin < middle)
15 {
16 if(sum == n) //和与n相等,则打印
17 {
18 printContinuous(begin, end, n);
19 //从begin+1开始重新计算sum的值
20 begin++;
21 end = begin+1;
22 sum = begin+end;
23 }
24 else if(sum > n)//如果sum>n,那么begin右移,即减去最左边的数
25 {
26 sum-=begin;
27 begin++;
28 }
29 else//如果sum
30 {
31 end++;
32 sum+=end;
33 }
34 }
35 }
复制代码
上面的解法可以满足题目的要求,我们现在试着用数学的方法来求解此题。题目中要求将给定整数表示为连续自然数的和,而连续自然数序列可以看做一个等差数列,那么题目可以重新描述为,求出和为给定整数值的自然数组成的等差数列。等差数列前n项和的公式为:a1*n+ n*(n-1)*d/2,其中a1表示首项值,n表示项数,d表示公差。根据公式,可以写出代码:
复制代码
1 void findContinuous2(int n)
2 {
3 for(int i=1; i
4 {
5 for(int j=1; j
6 {
7 //表示以i开头,到i后面j项为止的等差数列和
8 int sum = i*j+(j*(j-1)/2);
9 if(sum == n)
10 {
11 printContinuous(i, i+j-1, n);
12 }
13 }
14 }
15 }
复制代码
可以看出,数学对于一些算法还是比较重要的,不能说一定会提高程序的运行效率,但在解决一些问题是,数学上的知识会帮助我们更加清晰化的解法。
http://www.dengb.com/Javabc/907875.htmlwww.dengb.comtruehttp://www.dengb.com/Javabc/907875.htmlTechArticle将一个正整数表示为连续自然数的和 将一个正整数表示为连续自然数的和,比如给定整数15,那么根据题意,需要输出的连续自然数为1+2...
java表示自然数,将一个正整数表示为连续自然数的和相关推荐
- 连续正整数的和思路c语言,将一个正整数表示为连续自然数的和(附C实现源码)(原创)...
问题描述:将一个正整数表示为两个或这个两个以上的连续自然数的和.给定一个数,输出所有的可能的结果. 例如: 3=1+2; 9=4+5; 9=2+3+4; 解决方法: 对于给定的整数n,求解基本思路如下 ...
- 正整数表示为连续自然数的和(难度:1颗星)
问题描述: 输入一个正整数N,输出能相加等于N的联系序列的和(序列必须多于1项),如果这种序列存在,则输出所有这样的序列,如果不存在,则输出NULL. 例如:输入为15 输出: 1+2+3+4+5=1 ...
- 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
代码: package com.liron.p1;import java.util.Scanner;/**将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5.*/ public cla ...
- 整数拆分为连续自然数之和
闲得蛋疼: 连续自然数之和可以利用等差数列求和公式求得: , N=n*a+n*(n-1)/2: 其中N为需要拆分的整数,n为拆分后连续自然数个数,a为连续自然数中第一位数,比如: 36=11+12+1 ...
- 连续自然数平立方求和推导
连续自然数平立方求和推导 连续自然数求和公式推导 连续自然数平方和公式推导 连续自然数立方和公式推导 连续自然数求和公式推导 由 ( n + 1 ) 2 = n 2 + 2 n + 1 得 : ( n ...
- Java将一个正整数进行因数分解
Java将一个正整数进行因式分解 package p3;import java.util.Scanner;public class breaknumber {public static void ma ...
- Java——将一个正整数分解质因数
目录 题目描述 代码实现 结果展示 题目描述 将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 代码实现 import java.util.Scanner;public class ...
- 给定一个正整数n,计算有多少个不同的连续自然数段
给定一个正整数n,计算有多少个不同的连续自然数段,其中自然数的个数至少为2,其和恰为n. u 例如,当n = 27时,有3 个不同的长度大于等于2 的连续自然数段的和恰为27: 2 + 3 + 4 ...
- 【华为OD机试真题 JAVA】用连续自然数之和来表达整数
JS版:[华为OD机试真题 JS]用连续自然数之和来表达整数 标题:用连续自然数之和来表达整数 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 一个整数可以由连续的自然数之和来表 ...
- 华为OD机试 - 用连续自然数之和来表达整数(Java JS Python)
题目描述 一个整数可以由连续的自然数之和来表示. 给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式 输入描述 一个目标整数T (1 <=T<= 1000) 输出描述 ...
最新文章
- 编辑距离:最长公共子序列-LCS问题
- Atcoder Beginner Contest 124 解题报告
- Qt Linguist 翻译
- HttpClient学习系列 -- 学习总结
- rss聚合模式案例_RSS的完整形式是什么?
- #ifdef,#ifndef,#define,#endif解析(原)
- 分区起始位置参数溢出_Kafka分区副本分配解析
- SpringBoot (14)---日志配置(logback)
- python画圆填色橙色_基于TPC-C基准的Python ORM的性能测试详解
- netcat 传输文件
- 如何在一个月内通过PMP考试?(含资源)
- 高通9008刷机,刷机参考
- 为什么有符号数0XFFFF FFFF代表-1?
- C盘扩容好帮手——傲梅分区助手
- 无线鼠标插上去没反应
- linux物料管理,SAP-PM 工具管理篇之出入库
- python手机自动点击_通过电脑,模拟点击手机屏幕 /手机自动点击,刷金币?
- 【深度强化学习】(4) Actor-Critic 模型解析,附Pytorch完整代码
- mysql实现自增字符串_Mysql实现字符串主键自增示例教程-Go语言中文社区
- 安卓实现音乐播放器(暂停,播放)