问题描述:求一个正整数是哪几个正整数相加的和 (这些数要各不相同)

说明:给定一个正整数,如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,再继续。

求一个正整数是哪几个正整数相加的和,这些数不能相同相关推荐

  1. c语言整型最大数,C语言:求一个短整型正整数中的最大数字

    C语言:求一个短整型正整数中的最大数字 关注:84  答案:5  手机版 解决时间 2021-01-16 02:17 提问者舊倳偂歡 2021-01-15 14:26 例如整数12354中的最大数字是 ...

  2. 用计算机算算术平方根顺序是ON然后是什么,第2课时用计算器求一个正数的算术平方根.ppt...

    1.比较下列各组数的大小: (1) 与 (2) 与 8 依次按键 显示:1.732 050 808 例3 小丽想用一块面积为400 cm2的正方形纸片,沿着边的方向剪出一块面积为300 cm2的长方形 ...

  3. 求一个正整数是由哪几个连数(连续的正整数)相加

    题目描述:随便给出一个正整数, 求出这个数是由哪几个正整数相加,要求相加的这几个数是连续的. 如: 7+8=15,4+5+6=15,1+2+3+4+5=15 Test.java: package co ...

  4. 任意给定一个正整数N,求一个最小的正整数M(M1),使得N*M的十进制表示形式里只含有1和0。...

    题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解法一:暴力求解.从1开始查找M,然后判断M*N=X这个数字是否只含有0,1. 解法二:由 ...

  5. C语言--判断一个大于或等于3的正整数是不是素数

    要求:给出一个大于或等于3的正整数,判断它是不是一个素数. 分析: 素数是指除了1和该数本身之外,不能被其他任何整数整除的数. 判断一个数n(n>=3)是否为素数的方法:将n作为被除数,将2~( ...

  6. 【c语言】输入一个4位数,求四位数中各位数相加之和

    <程序设计基础实训指导教程-c语言>杨莉 龚义建 科学出版社 ISBN 978-7-03-032846-5 p9 2.1.2 上机实训内容 [实训内容1] 编程实现:输入一个4位数,求4位 ...

  7. Java黑皮书课后题第2章:2.6(求一个整数各位数的和)读取一个0和1000之间的整数,并将给整数的各位数字相加

    2.6(求一个整数各位数的和)读取一个0和1000之间的整数,并将给整数的各位数字相加 题目 题目描述 运行示例 题目槽点与破题 题目槽点 破题 如何提取数字 代码块 方法评价 题目 题目描述 2.6 ...

  8. C语言(CED)输入一个任意长度的正整数,将该数逆序输出。

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 题目内容: 输入一个任意长度的正整数,将该数逆序输出.如 ...

  9. 用正则表达式求非负整数 、匹配正整数、非正整数、负整数、整数、非负浮点数、正浮点数、非正浮点数、负浮点数、浮点数、有数字26个英文字母组成的字符串

    用正则表达式求非负整数 .匹配正整数.非正整数.负整数.整数.非负浮点数.正浮点数.非正浮点数.负浮点数.浮点数.有数字26个英文字母组成的字符串 // *** // 1.求非负整数: var str ...

最新文章

  1. 在《我的世界》里搭建神经网络,运行过程清晰可见,不仅好玩,而且代码全部开源!...
  2. 30 张图解 | 高频面试知识点总结:面试官问我高并发服务模型哪家强?
  3. TMG学习(十),发布DMZ区网站
  4. 浅析TCP之SACK(选择性确认)
  5. docker compose 在单机环境下一键打包运行
  6. C#去除字符串的最后一个字符
  7. Excel-在整个工作簿中查找/替换
  8. 【Docker系列教程之三】Docker容器是如何工作的
  9. SQLI-LABS(二)
  10. 【NOIP2013提高组】华容道
  11. 【编码-纠错码】通信编码中的R-S编码方式
  12. python md5加密解密_python md5加密解密
  13. jwplayer html插件,Angular4使用经验之:jwplayer插件运用到angular4插件普适法
  14. 小白也能学引流技巧:如何利用微信群找到你的精准用户| 二维彩虹二维码生成器
  15. 《查拉图斯特拉如是说》读书笔记
  16. c语言实现三角形面积公式字母,c语言计算三角形面积代码
  17. C语言循环语句的研究意义,C语言中循环语句的应用研究
  18. table表格tr、td、合并、间距、边框合并、设置边距 代码
  19. 凡事预则立不预则废---20180112
  20. doc转swf,主流文档在线查看解决方案--类似百度文档功能

热门文章

  1. 餐厅数据分析报告_如何使用数据科学选择理想的餐厅设计场所
  2. 初创公司怎么做销售数据分析_初创公司与Faang公司的数据科学
  3. leetcode50. Pow(x, n)(快速幂)
  4. 如何在React Native和Firebase中设置Google登录
  5. vim捐赠_#PayItBackwards-一位freeCodeCamp毕业生如何向事业捐赠10,000美元
  6. JavaScript正则表达式快速简单的指南
  7. ubuntu安装配置jdk
  8. Java swing中的keyListener使用事例
  9. php curl拉取远程图片
  10. 5年后你最想要什么?