`
yuchujin
  • 浏览: 31273 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

计算不同的正整数加出100的组合有多少种

 
阅读更多
计算不同的正整数加出100的组合有多少种,不考虑顺序,比如1 99 和99 1是一个
2个数字,还是可以是多个呢?


没有限制,这个是难点,1 99可以1 2 97, 1 2 3 94 这样的也行
import java.util.*;

public class NumbersAdd{
    public static int result = 30;//和
    public static void main(String[] args) {  
        //存放结果的map
        Map<Integer,List<Integer[]>> m = new HashMap<Integer,List<Integer[]>>();
        long startTime = System.currentTimeMillis();
        analyze(result,new Stack<Integer>(),m);
        System.out.println("【总共花费:】"+(System.currentTimeMillis()-startTime)+"毫秒");
    }
   //分解正整数
    public static void analyze(int sum,Stack<Integer> tempNumbers,Map<Integer,List<Integer[]>> m){
        int pushCount = 0;
        for(int i=1;i<=sum;i++){
            pushCount = 0;
            if(!isUsed(i,tempNumbers)){
                tempNumbers.push(i);//获得一个数作为当前数,并亚栈
                ++pushCount;
                analyze(sum-i,tempNumbers,m);//分解(sum-当前数)
                tempNumbers.pop();//将当前数出栈
            }
        }
        //该正整数不可再分解
        if(pushCount == 0 && !isUsed(sum,tempNumbers)){
            if(sum == 0){
                haveResult(result,tempNumbers,m);//判断栈中和是否能求出结果
            }else{
                tempNumbers.push(sum);
                haveResult(result,tempNumbers,m);//判断栈中和是否能求出结果
                tempNumbers.pop();
            }
        }
    }
    //判断是否有结果
    public static boolean haveResult(int result,Stack<Integer> tempNumbers,Map<Integer,List<Integer[]>> m){
        boolean flag = false;
        int sum = 0;
        for(Integer i : tempNumbers){
            sum += i;
        }
        //将结果整数序列和原来已求的整数序列比较,如果不相同则放入Map中
        if(result == sum){
            Integer[] nums = new Integer[tempNumbers.size()];
            tempNumbers.toArray(nums);
            Arrays.sort(nums);
            List<Integer[]> numsList = m.get(nums.length);
            if(numsList == null){
                numsList = new ArrayList<Integer[]>();
                m.put(nums.length,numsList);
            }
            boolean numbersIsSame = false;
            for(int i=0;i<numsList.size();i++){
                Integer[] beforeNums = numsList.get(i);
                boolean numIsSame = true;
                for(int j=0;j<beforeNums.length;j++){
                    if(beforeNums[j] != nums[j]){
                        numIsSame = false;
                        break;
                    }
                }
                if(numIsSame){
                    numbersIsSame = true;
                    break;
                }
            }
            if(!numbersIsSame){
                numsList.add(nums);
            }
        }
        return flag;
    }
    //判断栈中正整数是否存在
    public static boolean isUsed(int num,Stack<Integer> tempNumbers){
        boolean flag = false;
        for(Integer i : tempNumbers){
            if(num == i){
                flag = true;
                break;
            }
        }
        return flag;
    }
    //打印结果
    public static void printResult(Map<Integer,List<Integer[]>> m){
         if(m.keySet().size() == 0){
             System.out.println("没有式子");
         }
         //输出求得的结果式子
         for(int i : m.keySet()){
             if(i == 1){ //排除result = result的情况
                 continue;
             }
             System.out.println(i+"位相加的有:"+m.get(i).size()+"个");
             List<Integer[]> numsList = m.get(i);
             for(Integer[] nums : numsList){
                 String s = "";
                 for(int num : nums){
                     s += num + "+";
                 }
                 s = s.substring(0, s.length()-1) + "=" + result;   
                 System.out.println(s);
             }
         }
    }
}




分享到:
评论

相关推荐

    Integer Factorization 对于给定的正整数n,编程计算n共有多少种不同的分解式。

    例如,给定一个正整数\( n \),我们需要找出所有可能的形式 \( n = X_1 \times X_2 \times \ldots \times X_m \),其中 \( X_i \) 也是正整数。 在本题中,我们特别关注的是找到给定正整数的所有不同的分解方式的...

    用递归法计算从n个正整数中选择k个数的不同组合数

    在计算机科学和数学中,计算从n个正整数中选择k个数的不同组合数是一项基本的任务,这涉及到组合数学中的组合(Combination)概念。组合是指从一个集合中不考虑顺序取出k个元素的方法数,它与排列(Permutation)...

    整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。

    在本问题中,我们需要找到一个正整数\( n \)的所有可能的划分方式,并计算出这些划分的数量。具体来说,对于一个正整数\( n \),其划分可以表示为: \[ n = n_1 + n_2 + \ldots + n_k \] 其中满足\( n_1 \geq n_2 \...

    将一个正整数拆分成若干个正整数的和.zip

    而`Composition.java`很可能包含了核心的算法实现,"Composition"这个词可能是指组合的意思,与题目中的“拆分”相对应,暗示了代码可能涉及组合不同的正整数来达到目标和。 接下来,我们将深入探讨这个算法问题的...

    整数划分,并输出结果

    整数划分是组合数学中的一个重要概念,指的是将一个正整数表示为若干个正整数之和的不同方式的数量。例如,数字4可以被划分为1+1+1+1、1+1+2、1+3或4本身等几种不同的方式。每种不同的组合被视为一种划分方法。 ###...

    阶乘排列组合计算

    阶乘表示的是一个正整数n的所有小于等于n的正整数的乘积,通常用"!"表示。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。阶乘在计算组合数量、解决递归问题和建立概率模型时非常有用。Delphi程序中的阶乘计算功能,可以...

    算出从n个不同元素中取出m个元素(m≤n)的组合数——C语言代码

    "代表阶乘,即一个正整数n的阶乘是所有小于等于n的正整数的乘积。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。 在C语言中,计算阶乘可以自底向上递归实现,也可以使用循环结构。递归方法虽然直观,但对较大的n可能会...

    组合理论及其应用 李凡长 课后习题 答案

    在小于2000的数中,有多少个正整数含有数字2? **解题思路**: - 首先明确范围,即考虑1000到1999之间的数,以及100到999之间的数。 - 分别考虑千位、百位、十位和个位上出现数字2的情况。 - 利用加法原理计算出...

    钱币组合方法数的问题(C++实现)

    - 第一行输入一个正整数 n (1 ≤ n ≤ 10),表示有 n 种不同的钱币。 - 第二行输入 n 个整数,表示每种钱币的面额。 - 第三行输入 n 个整数,表示每种钱币的数量。 - 第四行输入一个整数 m (1 ≤ m ≤ 20001),表示...

    整数划分问题

    整数划分问题是一个经典的组合数学问题,主要研究如何将一个正整数分解为若干个正整数之和的不同方式。这个问题不仅在数学领域有广泛的应用,在计算机科学、算法设计等方面也具有重要意义。 #### 二、题目描述及...

    数的划分1

    在描述中,我们看到这是一道关于算法的题目,具体是询问给定正整数有多少种不同的划分方式。 问题描述明确指出,当给定的正整数为n时,例如n等于3,那么可以有以下几种划分方法: 1. 3(直接用原数) 2. 1+2(两个...

    输入两个正整数m和n求其最大公约数和最小公倍数 (2).pdf

    47. **百元买百鸡问题**:典型的整数线性规划问题,通过穷举所有可能的组合找出解。 48. **Fibonacci数列计算**:创建数组存储前20项,并一次性输出。 以上这些题目都是计算机科学基础课程常见的练习,它们旨在...

    钱币组合方法问题

    设有 3 种不同的钱币(1 分、2 分、5 分)各若干张,可用这 3 种钱币产生许多不同的面值。如给定面值 7 分,能组成给定面值 7 分的方法有如下 4 种: 1. 3 个 1 分 + 2 个 2 分; 2. 1 个 1 分 + 3 个 2 分; 3. 2 ...

    阶乘与排列组合算法 各行各业都能用到

    )是计算一个正整数n的所有小于等于n的正整数乘积,而排列组合则是解决如何从给定元素集合中选择特定数量的元素,考虑顺序或者不考虑顺序的问题。 首先,我们来详细解释阶乘。阶乘在数学上定义为n! = n × (n-1) ×...

    阶乘 组合 排列 计算程序

    阶乘是数学中的一个运算,表示一个正整数n的所有小于等于n且大于0的正整数的乘积。记为n!。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。在VB中,可以创建一个递归或循环函数来计算阶乘: ```vb Function Factorial...

    组合数学 组合数学 组合数学

    为了证明这一定理,文章采用了两个不同的视角来考虑同一个问题:从\( n \)个不同类型的元素中选取\( r \)个元素的所有可能的组合方式有多少种? - **视角一**:通过构建一个简单的模型,如排列不同型号的砖块,...

    组合数学 组合数 整数划分 递推 方程 多项式定理

    - **分划**:指将一个正整数表示为若干个正整数之和的不同方式。 - **第二类Stirling数**:用来表示将一个集合分成不相交子集的方法数。具体地,\(S(n, k)\) 表示将 \(n\) 个不同的对象分成 \(k\) 个非空集合的方法...

    钱币组合问题/动态规划/C语言

    - 第一行:一个正整数n,表示有n种不同的钱币。 - 第二行:n个数,表示每种钱币的面值。 - 第三行:n个数,表示每种钱币的数量。 - 第四行:一个数m,表示目标面值。 2. **求解过程**:采用递归的方式,利用...

    兑换硬币的C代码

    写一个程序,从标准输入上读入一个正整数N(1 ),计算出N元人民币兑换成1分、2分和5分的硬币,有多少种可能的组合。将结果以整数的方式输出到标准输出上,占一行。【输入形式】 正整数N。(1 ) 【输出形式】 整数。

    java 求任意一个正数的阶乘

    在编程领域,阶乘是一个常见的数学概念,通常用于计算组合数和概率问题。在Java中,我们可以使用循环或递归的方式来实现求解任意正整数的阶乘。本篇文章将详细探讨如何用Java来计算阶乘。 首先,我们需要理解阶乘的...

Global site tag (gtag.js) - Google Analytics