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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理学

管理学<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />第一 什么是管理学管理学有两种认识&#xff1a;其一&#xff0c;运筹学(Operation Research)是一门运用科学&#xff0c;并不是纯粹的数学&#xff0c;它具有多学科交叉的…

react(89)--设置只能正整数

<InputNumber// formatter{limitDecimals}// parser{limitDecimals}precision{0}placeholder"请输入助力人数"min{0}/>

bootstrap学习笔记(一)网络系统

注&#xff1a;我是根据自己理解写的 有参考http://www.w3cschool.cc/bootstrap该教程。 bootstrap目前有两种默认的网络&#xff08;格&#xff09;系统&#xff1a;一个是940px,另一个是12列。 我们先从12列入手看看&#xff1a; 1.Bootstrap 使用 CSS 的 class "row&q…

最简单的java单例

最简单的java单例源代码&#xff1a; class Singleton{ private Singleton() { } public static Singleton instance null; public static Singleton getInstance() { if(instance null) instance new Singleton(); return instance; } public static void main(String…

委托笔记

刚写了段程序&#xff0c;总算稍微理解了下委托&#xff0c;留下备忘。 定义&#xff1a; 1 publicdelegatestringDelegateTest(stringsss);类中实例化委托&#xff1a; 1 publicclassTestClass2 {3 publiceventDelegateTest _delegateTest;4 5 publicstringBeginDelegate()6 {…

react(90)--时间戳比较

if (new Date(values.activityTimeStamp[1]).getTime() <new Date(values.openTimeStamp[0]).getTime()) {message.error(开放给商户提报的结束时间要大于等于活动开始时间);return false;}

primefaces 带参数的组件

分析了一下primefaces extension showcase的源码&#xff0c;总结一下组件传参的方式。 下面定义了一个组件&#xff0c;名为fourTabsDecoratorCustom.xhtml 1: <html xmlns"http://www.w3.org/1999/xhtml" 2: xmlns:h"http://xmlns.jcp.org/jsf/html&…

枚举windows进程

将当前运行的进程列举出来(C Code): #include<windows.h>#include<tlhelp32.h>//#include <iomanip>#include<iostream>using namespace std; int main(){ int count0; PROCESSENTRY32 pe32; //使用这个数据之前设置大小 pe32.dwSizesiz…

程序员的职业发展

在中国有很多人都认为IT行为是吃青春饭的&#xff0c;如果过了30岁就很难有机会再发展下去&#xff01;其实现实并不是这样子的&#xff0c;现在过30岁的已经慢慢多起来了&#xff0c;也不见得混得不好。下面结合自己的经历&#xff0c;与大家一起探讨一下。 明确入行的目的 很…

C++ 20 协程总结

C 20 协程总结 介绍 C 20提供的是非对称的、一等对象、无栈的协程&#xff08;Coroutines in C20 are asymmetric, first-class, and stackless&#xff09; 所谓协程&#xff0c;即用户级线程&#xff0c;一种用于将异步代码同步化的编程机制&#xff0c;使得程序的执行流可…

VC++6.0开发环境之快捷键

F1&#xff1a; 帮助 CtrlO &#xff1a;Open CtrlP &#xff1a;Print CtrlN &#xff1a;New CtrlShiftF2 &#xff1a;清除所有书签 F2 &#xff1a;上一个书签 ShiftF2 &#xff1a;上一个书签 AltF2 &#xff1a;编辑书签 Ctrl&#xff0b;F2 &#xff1a;添加/删除一个书…

react(92)--批量删除进行置空操作

//批量删除handleDeleteAll () > {this.props.dispatch({type: startpage/updateState,payload: { selectedRowKeys: [] },});const { selectedRowKeys } this.props.startpage;if (selectedRowKeys.length 0) {message.error(当前未选择);return false;}this.deletePoin…

.net程序员的盲点(八):泛型

1.泛型介绍泛型类和泛型方法同时具备可重用性、类型安全和效率&#xff0c;这是非泛型类和非泛型方法无法具备的。泛型通常用在集合和在集合上运行的方法中。.NET Framework 2.0 版类库提供一个新的命名空间System.Collections.Generic&#xff0c;其中包含几个新的基于泛型的集…

C++20 协程实现线程同步示例

C20 协程实现线程同步示例 class Event { public:Event() default;Event(const Event&) delete;Event(Event&&) delete;Event& operator(const Event&) delete;Event& operator(Event&&) delete;class Awaiter;Awaiter operator co_await…

react(93)--成功置空

//删除页面逻辑的封装deletePointsDefinition (list) > {this.props.dispatch({type: activity/deleteActivityPopup,payload: {codeList: list,},callback: (res) > {console.log(res, res);if (res.returnCode 0) {message.success(操作成功);\this.props.dispatch({…

给窗口设置系统级或窗口级的热键

开发环境&#xff1a;VS2005, C#语言 为了给一个程序加一个系统级的热键&#xff0c;在开发时需要使用到下面的代码&#xff0c;就是在程序中注册和卸载热键。 1。首先在Form1类的函数中添加如下代码&#xff1a; [DllImport("user32.dll")] private static…

Sublime Text 插件之常用20个插件

作为一个开发者你不可能没听说过 Sublime Text。不过你没听说过也没关系&#xff0c;下面让你明白。 Sublime Text是一款非常精巧的文本编辑器&#xff0c;适合编写代码、做笔记、写文章。它用户界面十分整洁&#xff0c;功能非同凡响&#xff0c;性能快得出奇。这些非常棒的特…

JUnit 4 与 JUnit 3

JUnit 是 Java? 语言事实上的 标准单元测试库。JUnit 4 是该库三年以来最具里程碑意义的一次发布。它的新特性主要是通过采用 Java 5 中的标记&#xff08;annotation&#xff09;而不是利用子类、反射或命名机制来识别测试&#xff0c;从而简化测试。在本文中&#xff0c;执着…

输出特殊形状的图形

输出如下面这种形状的图形&#xff1a; 4 3 7 2 6 9 1 5 8 10 C Code: #include<iostream> using namespace std; //N: 代表有多少行元素void Display(int N){ int i, j, v; if(N < 0) { cout<<"N must bigger than Zero(0)!"<<endl<&l…