求一个正整数是哪几个正整数相加的和,这些数不能相同
问题描述:求一个正整数是哪几个正整数相加的和 (这些数要各不相同)
说明:给定一个正整数,如8,要求输出以下数组,因为他们的和为8:
[1, 2, 5]
[1, 3, 4]
[1, 7]
[2, 6]
[3, 5]
[8]
代码是一个牛人写的,我只是加了几个语句来输出程序具体的执行过程:
package com.joe;
import java.util.LinkedList;
public class T
{
static LinkedList<Integer> list = new LinkedList<Integer>();
public static void split(int n, int base)
{
if (n == 0)
{
System.out.println("找到一个组合:" + list);
System.out.println();
return;
}
for (int i = base + 1; i <= n; i++)
{
list.addLast(i);
System.out.println("添加" + i + ", 当前list = " + list + ", 进入递归调用split(" + (n-i) + ", " + i + ")");
split(n - i, i); // n-i 实际上是把之前所添加进list的数都减掉,等于0时说明list中的数加起来刚好等于n
System.out.print("当前list = " + list + ", 删除最后一个元素:");
int delNum = list.removeLast(); // 从下层递归返回才会执行这句,最后一个添加的数不符合要求
System.out.print(delNum);
System.out.println("。返回到上层递归中的for循环,此时list = " + list + ",i=" + i + ", 执行i++后判断i<=" + n + ",再继续。");
}
}
public static void main(String[] args)
{
split(8, 0);
}
}
运行结果:
添加1, 当前list = [1], 进入递归调用split(7, 1)
添加2, 当前list = [1, 2], 进入递归调用split(5, 2)
添加3, 当前list = [1, 2, 3], 进入递归调用split(2, 3)
当前list = [1, 2, 3], 删除最后一个元素:3。返回到上层递归中的for循环,此时list = [1, 2],i=3, 执行i++后判断i<=5,再继续。
添加4, 当前list = [1, 2, 4], 进入递归调用split(1, 4)
当前list = [1, 2, 4], 删除最后一个元素:4。返回到上层递归中的for循环,此时list = [1, 2],i=4, 执行i++后判断i<=5,再继续。
添加5, 当前list = [1, 2, 5], 进入递归调用split(0, 5)
找到一个组合:[1, 2, 5]
当前list = [1, 2, 5], 删除最后一个元素:5。返回到上层递归中的for循环,此时list = [1, 2],i=5, 执行i++后判断i<=5,再继续。
当前list = [1, 2], 删除最后一个元素:2。返回到上层递归中的for循环,此时list = [1],i=2, 执行i++后判断i<=7,再继续。
添加3, 当前list = [1, 3], 进入递归调用split(4, 3)
添加4, 当前list = [1, 3, 4], 进入递归调用split(0, 4)
找到一个组合:[1, 3, 4]
当前list = [1, 3, 4], 删除最后一个元素:4。返回到上层递归中的for循环,此时list = [1, 3],i=4, 执行i++后判断i<=4,再继续。
当前list = [1, 3], 删除最后一个元素:3。返回到上层递归中的for循环,此时list = [1],i=3, 执行i++后判断i<=7,再继续。
添加4, 当前list = [1, 4], 进入递归调用split(3, 4)
当前list = [1, 4], 删除最后一个元素:4。返回到上层递归中的for循环,此时list = [1],i=4, 执行i++后判断i<=7,再继续。
添加5, 当前list = [1, 5], 进入递归调用split(2, 5)
当前list = [1, 5], 删除最后一个元素:5。返回到上层递归中的for循环,此时list = [1],i=5, 执行i++后判断i<=7,再继续。
添加6, 当前list = [1, 6], 进入递归调用split(1, 6)
当前list = [1, 6], 删除最后一个元素:6。返回到上层递归中的for循环,此时list = [1],i=6, 执行i++后判断i<=7,再继续。
添加7, 当前list = [1, 7], 进入递归调用split(0, 7)
找到一个组合:[1, 7]
当前list = [1, 7], 删除最后一个元素:7。返回到上层递归中的for循环,此时list = [1],i=7, 执行i++后判断i<=7,再继续。
当前list = [1], 删除最后一个元素:1。返回到上层递归中的for循环,此时list = [],i=1, 执行i++后判断i<=8,再继续。
添加2, 当前list = [2], 进入递归调用split(6, 2)
添加3, 当前list = [2, 3], 进入递归调用split(3, 3)
当前list = [2, 3], 删除最后一个元素:3。返回到上层递归中的for循环,此时list = [2],i=3, 执行i++后判断i<=6,再继续。
添加4, 当前list = [2, 4], 进入递归调用split(2, 4)
当前list = [2, 4], 删除最后一个元素:4。返回到上层递归中的for循环,此时list = [2],i=4, 执行i++后判断i<=6,再继续。
添加5, 当前list = [2, 5], 进入递归调用split(1, 5)
当前list = [2, 5], 删除最后一个元素:5。返回到上层递归中的for循环,此时list = [2],i=5, 执行i++后判断i<=6,再继续。
添加6, 当前list = [2, 6], 进入递归调用split(0, 6)
找到一个组合:[2, 6]
当前list = [2, 6], 删除最后一个元素:6。返回到上层递归中的for循环,此时list = [2],i=6, 执行i++后判断i<=6,再继续。
当前list = [2], 删除最后一个元素:2。返回到上层递归中的for循环,此时list = [],i=2, 执行i++后判断i<=8,再继续。
添加3, 当前list = [3], 进入递归调用split(5, 3)
添加4, 当前list = [3, 4], 进入递归调用split(1, 4)
当前list = [3, 4], 删除最后一个元素:4。返回到上层递归中的for循环,此时list = [3],i=4, 执行i++后判断i<=5,再继续。
添加5, 当前list = [3, 5], 进入递归调用split(0, 5)
找到一个组合:[3, 5]
当前list = [3, 5], 删除最后一个元素:5。返回到上层递归中的for循环,此时list = [3],i=5, 执行i++后判断i<=5,再继续。
当前list = [3], 删除最后一个元素:3。返回到上层递归中的for循环,此时list = [],i=3, 执行i++后判断i<=8,再继续。
添加4, 当前list = [4], 进入递归调用split(4, 4)
当前list = [4], 删除最后一个元素:4。返回到上层递归中的for循环,此时list = [],i=4, 执行i++后判断i<=8,再继续。
添加5, 当前list = [5], 进入递归调用split(3, 5)
当前list = [5], 删除最后一个元素:5。返回到上层递归中的for循环,此时list = [],i=5, 执行i++后判断i<=8,再继续。
添加6, 当前list = [6], 进入递归调用split(2, 6)
当前list = [6], 删除最后一个元素:6。返回到上层递归中的for循环,此时list = [],i=6, 执行i++后判断i<=8,再继续。
添加7, 当前list = [7], 进入递归调用split(1, 7)
当前list = [7], 删除最后一个元素:7。返回到上层递归中的for循环,此时list = [],i=7, 执行i++后判断i<=8,再继续。
添加8, 当前list = [8], 进入递归调用split(0, 8)
找到一个组合:[8]
当前list = [8], 删除最后一个元素:8。返回到上层递归中的for循环,此时list = [],i=8, 执行i++后判断i<=8,再继续。
求一个正整数是哪几个正整数相加的和,这些数不能相同相关推荐
- c语言整型最大数,C语言:求一个短整型正整数中的最大数字
C语言:求一个短整型正整数中的最大数字 关注:84 答案:5 手机版 解决时间 2021-01-16 02:17 提问者舊倳偂歡 2021-01-15 14:26 例如整数12354中的最大数字是 ...
- 用计算机算算术平方根顺序是ON然后是什么,第2课时用计算器求一个正数的算术平方根.ppt...
1.比较下列各组数的大小: (1) 与 (2) 与 8 依次按键 显示:1.732 050 808 例3 小丽想用一块面积为400 cm2的正方形纸片,沿着边的方向剪出一块面积为300 cm2的长方形 ...
- 求一个正整数是由哪几个连数(连续的正整数)相加
题目描述:随便给出一个正整数, 求出这个数是由哪几个正整数相加,要求相加的这几个数是连续的. 如: 7+8=15,4+5+6=15,1+2+3+4+5=15 Test.java: package co ...
- 任意给定一个正整数N,求一个最小的正整数M(M1),使得N*M的十进制表示形式里只含有1和0。...
题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解法一:暴力求解.从1开始查找M,然后判断M*N=X这个数字是否只含有0,1. 解法二:由 ...
- C语言--判断一个大于或等于3的正整数是不是素数
要求:给出一个大于或等于3的正整数,判断它是不是一个素数. 分析: 素数是指除了1和该数本身之外,不能被其他任何整数整除的数. 判断一个数n(n>=3)是否为素数的方法:将n作为被除数,将2~( ...
- 【c语言】输入一个4位数,求四位数中各位数相加之和
<程序设计基础实训指导教程-c语言>杨莉 龚义建 科学出版社 ISBN 978-7-03-032846-5 p9 2.1.2 上机实训内容 [实训内容1] 编程实现:输入一个4位数,求4位 ...
- Java黑皮书课后题第2章:2.6(求一个整数各位数的和)读取一个0和1000之间的整数,并将给整数的各位数字相加
2.6(求一个整数各位数的和)读取一个0和1000之间的整数,并将给整数的各位数字相加 题目 题目描述 运行示例 题目槽点与破题 题目槽点 破题 如何提取数字 代码块 方法评价 题目 题目描述 2.6 ...
- C语言(CED)输入一个任意长度的正整数,将该数逆序输出。
(请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 题目内容: 输入一个任意长度的正整数,将该数逆序输出.如 ...
- 用正则表达式求非负整数 、匹配正整数、非正整数、负整数、整数、非负浮点数、正浮点数、非正浮点数、负浮点数、浮点数、有数字26个英文字母组成的字符串
用正则表达式求非负整数 .匹配正整数.非正整数.负整数.整数.非负浮点数.正浮点数.非正浮点数.负浮点数.浮点数.有数字26个英文字母组成的字符串 // *** // 1.求非负整数: var str ...
最新文章
- 在《我的世界》里搭建神经网络,运行过程清晰可见,不仅好玩,而且代码全部开源!...
- 30 张图解 | 高频面试知识点总结:面试官问我高并发服务模型哪家强?
- TMG学习(十),发布DMZ区网站
- 浅析TCP之SACK(选择性确认)
- docker compose 在单机环境下一键打包运行
- C#去除字符串的最后一个字符
- Excel-在整个工作簿中查找/替换
- 【Docker系列教程之三】Docker容器是如何工作的
- SQLI-LABS(二)
- 【NOIP2013提高组】华容道
- 【编码-纠错码】通信编码中的R-S编码方式
- python md5加密解密_python md5加密解密
- jwplayer html插件,Angular4使用经验之:jwplayer插件运用到angular4插件普适法
- 小白也能学引流技巧:如何利用微信群找到你的精准用户| 二维彩虹二维码生成器
- 《查拉图斯特拉如是说》读书笔记
- c语言实现三角形面积公式字母,c语言计算三角形面积代码
- C语言循环语句的研究意义,C语言中循环语句的应用研究
- table表格tr、td、合并、间距、边框合并、设置边距 代码
- 凡事预则立不预则废---20180112
- doc转swf,主流文档在线查看解决方案--类似百度文档功能
热门文章
- 餐厅数据分析报告_如何使用数据科学选择理想的餐厅设计场所
- 初创公司怎么做销售数据分析_初创公司与Faang公司的数据科学
- leetcode50. Pow(x, n)(快速幂)
- 如何在React Native和Firebase中设置Google登录
- vim捐赠_#PayItBackwards-一位freeCodeCamp毕业生如何向事业捐赠10,000美元
- JavaScript正则表达式快速简单的指南
- ubuntu安装配置jdk
- Java swing中的keyListener使用事例
- php curl拉取远程图片
- 5年后你最想要什么?