任意整数有几种分解方法 java_整数的分解方法
腾讯 2017春招真题
题目
如下示例:
1:共0种分解方法;
2:共0种分解方法;
3:3=2+1 共1种分解方法;
4:4=3+1=2+1+1 共2种分解方法;
5:5=4+1=3+2=3+1+1=2+2+1=2+1+1+1 共5种分解方法
6:6=5+1=4+2=4+1+1=3+2+1=3+1+1+1=2+2+1+1=2+1+1+1+1 共7种分解方法
以此类推,求一任意整数num有几种分解方法?
输入一个数字(1到90),输出该整数的分解方法个数
如:
输入:2——输出:0
输入:3——输出:1
输入:5——输出:5
分析
为保证输出的唯一性,保持降序排列
列表分析3~7的分解情况:
当前数
分解情况以1结尾
分解情况以2结尾
分解情况以3结尾
分解情况总数
3
① 2+1
---
---
1
4
① 3+1
② 2+1+1
(②是将3进一步分解)
---
(2+2不算,分解出来的数不能都相等)
---
2
5
① 4+1
② 2+2+1
③ 3+1+1
④ 2+1+1+1
(②--④是将4进一步分解,此时4=2+2也算)
① 3+2
---
5
6
① 5+1
② 4+1+1
③ 2+2+1+1
④ 3+1+1+1
⑤ 2+1+1+1+1
⑥ 3+2+1
(②--⑥是将5进一步分解)
① 4+2
---
(3+3不算)
7
7
① 6+1
② 3+3+1
③ 5+1+1
④ 4+1+1+1
⑤ 2+2+1+1+1
⑥ 3+1+1+1+1
⑦ 2+1+1+1+1+1
⑧ 3+2+1+1
⑨ 4+2+1
(②--⑨是将5进一步分解)
① 5+2
② 3+2+2
(②是将5进一步分解,且只取5的分解情况中结尾数>=2的,才能保证降序排列)
① 4+3
12
总结分解方法:
对于数num,按照分解情况的结尾数字考虑:以1结尾,以2结尾,...,以Math.floor((num - 1) / 2)结尾,每种结尾都先进行一次分解(以7为例,以1结尾时分解成6+1,以2结尾分解成5+2,以3结尾分解成4+3)
对于第一次分解出的两个数(num1,num2),进一步分解num1,且只在num1 > 2*num2 时分解num1(否则无法保证降序,例:5=3+2,3继续分解出2+1,则5=2+1+2不是降序)
若num1是偶数,计算分解情况时+1(例:5=4+1,进一步分解4时,要考虑4=2+2)
保证num1进一步分解的结尾的数>=num2(例:7=5+2,进一步分解5时,只能将5分解成3+2,若分解成任意以1结尾的情况,如4+1,则7=4+1+2不是降序)
因此,我们运用动态规划的方法,从3开始往大数分析,构造二维数组,横坐标表示当前分析的数,纵坐标表示当前分解情况结尾的数
解答
解法1:(我)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int num = sc.nextInt();
int result = 0;
int[][] arr = new int[num+1][];
for(int i = 3; i <= num; i++){
int columnNum = (int)Math.floor((i-1)/2d);
arr[i] = new int[columnNum];
for(int j = 0; j < columnNum; j++){
arr[i][j] = 1;
int num2 = j + 1;
int num1 = i - num2;
if(num1 > 2 * num2){//只有这种情况才分解
if(num1 % 2 == 0){//num1是偶数,计算分解情况时+1
arr[i][j]++;
}
//计算数1的分解情况
for (int k = j; k < arr[num1].length; k++){
arr[i][j] += arr[num1][k];
}
}
}
}
// 输出整个二维数组的情况
// for(int i = 3; i <= num; i++){
// for(int j = 0; j < arr[i].length;j++){
// System.out.println("arr["+i+"]["+j+"] is: "+arr[i][j]);
// }
// }
if(num == 1 || num == 2) result = 0;
else{
for(int i = 0; i < arr[num].length;i++){
result += arr[num][i];
}
}
System.out.println(result);
}
}
}
任意整数有几种分解方法 java_整数的分解方法相关推荐
- 8种提升程序猿编程能力的方法+编程思维四个核心:分解、抽象、模式识别和算法
8种提升程序猿编程能力的方法 对于程序员来说,提高自己的编程能力,算是给自己定的职业发展目标之一,不过定一个成为编程大神的目标很容易,具体做起来可能就不是一件简单的事了.首先,既然决定"我要 ...
- js中几种对数值取整数和小数部分的方法
js中几种对数值取整数和小数部分的方法 取整 (1)parseInt 用法:parseInt(num) 这是最常见的一种取整方式,但是其实parseInt并不是为了取整而设计的 注: parseInt ...
- JAVA中取整数的四种方法有哪些?面试篇(第五天)
向下取整 Math.floor(),向下取整顾名思义就是取最小的整数,如1.9就返回值为1.0,-1.9就返回-2.0,返回的总是小于等于原数,如图. 向上取整 Math.ceil(),向上取整顾名思 ...
- fir fpga 不同截止频率_一种新的FIR滤波器系数量化方法
相对于模拟滤波器,数字滤波器具有高精度.高可靠性.可编程改变滤波特性.便于集成等一系列优点,并且理论上可实现近似理想频率特性的滤波性能.经典的数字滤波器主要包括有限脉冲响应(Finite Impuls ...
- 算术基本定理“质数分解唯一性的证明”:古典方法与现代方法
算术基本定理的最早证明是由欧几里得给出的. 每一个比1大的自然数N只能有一种方式分解成质数的乘积. 推论:若一个质数p是乘积ab的因子,则p不是a的因子就是b的因子. 大于1的自然数必可写成质数之积 ...
- 1123581321递归算法java_经典算法设计方法
本文转自博客园 一.什么是算法 算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.算法常常含有重复的步骤和一些比较或逻辑判断.如果一个算法有缺陷,或不适合于 ...
- 一种新的高级抖动分离解析方法
一种新的高级抖动分离解析方法 A new analytic approach for advanced jitter separation 抖动分量的分析是现代通信系统调试中一项越来越重要的任务.一方 ...
- 伯克利提出AdaSearch:一种用于自适应搜索的逐步消除方法
在机器学习领域的诸多任务当中,我们通常希望能够立足预先给定的固定数据集找出问题的答案.然而,在某些应用场景下我们并没有先验数据可供参考; 相反,我们必须自行收集数据以回答那些自己感兴趣的问题.举例来说 ...
- 一种快速的公交专用车道检测方法
一种快速的公交专用车道检测方法 关键词:公交车,车道线检测,摄像头 时间:2012-09-19 15:56:48 来源:中电网 目前,国内外学者已经提出了很多车道线检测算法,主要分为两类:一 ...
最新文章
- svn中的revert和update
- 从技术角度分析“抢票软件的加速”有多快?
- ajax从mysql提取数据在html中_EXCEL混合内容中提取数据,其实很简单
- [Android Studio 权威教程]Windows下安装Android Studio
- 微服务之迷思--转几位大牛的文章
- 单件模式(单例模式)
- 双11终于来了,你盖楼了吗?
- 宁德时代是前8个月全球最大电动汽车电池供应商
- mysql并发死锁问题解决
- JavaScript执行机制-node事件循环
- js基础知识汇总01
- 3.26 Tensorflow 实验记录
- 比较5个最佳的PHP表单生成器(和4个免费脚本)
- C++ 实现一个虚拟聊天软件
- 史上最强的烧脑合集!能全都搞懂的只有天才!
- vbscript下载文件(使用https绕过无效的证书错误)
- arch linux安装命令,arch linux:安装Arch Linux方法介绍
- 纯前端解码、播放、录音、编码 AMR 音频,无须服务器支持
- 微信小程序开发笔记 支付篇③——微信支付JSAPI下单和微信小程序调起支付(V2版本)
- VMware ESXi支持配置最大值
热门文章
- 苏格拉底 麦穗问题?
- 【更新中】Unity 2020 发行说明(XR相关汇总)
- 简易iframe-前端web网页设计(iframe标签运用)
- Windows10 安装、升级失败,错误 0x800701b1 - 0x2000A
- 【PS-7】移动工具
- 类跑酷游戏“忍者跳跃”的 Cocos Creator实现
- 如何利用MATLAB来求二元函数的一阶偏微分
- 【面试】ASP.NET Core+Redis+Mysql面试题答案
- leecode 数据库: 602. 好友申请 II :谁有最多的好友
- PS第五课--钢笔工具