计算不同的正整数加出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);
}
}
}
}
分享到:
相关推荐
例如,给定一个正整数\( n \),我们需要找出所有可能的形式 \( n = X_1 \times X_2 \times \ldots \times X_m \),其中 \( X_i \) 也是正整数。 在本题中,我们特别关注的是找到给定正整数的所有不同的分解方式的...
在计算机科学和数学中,计算从n个正整数中选择k个数的不同组合数是一项基本的任务,这涉及到组合数学中的组合(Combination)概念。组合是指从一个集合中不考虑顺序取出k个元素的方法数,它与排列(Permutation)...
在本问题中,我们需要找到一个正整数\( n \)的所有可能的划分方式,并计算出这些划分的数量。具体来说,对于一个正整数\( n \),其划分可以表示为: \[ n = n_1 + n_2 + \ldots + n_k \] 其中满足\( n_1 \geq n_2 \...
而`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的阶乘是所有小于等于n的正整数的乘积。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。 在C语言中,计算阶乘可以自底向上递归实现,也可以使用循环结构。递归方法虽然直观,但对较大的n可能会...
在小于2000的数中,有多少个正整数含有数字2? **解题思路**: - 首先明确范围,即考虑1000到1999之间的数,以及100到999之间的数。 - 分别考虑千位、百位、十位和个位上出现数字2的情况。 - 利用加法原理计算出...
- 第一行输入一个正整数 n (1 ≤ n ≤ 10),表示有 n 种不同的钱币。 - 第二行输入 n 个整数,表示每种钱币的面额。 - 第三行输入 n 个整数,表示每种钱币的数量。 - 第四行输入一个整数 m (1 ≤ m ≤ 20001),表示...
整数划分问题是一个经典的组合数学问题,主要研究如何将一个正整数分解为若干个正整数之和的不同方式。这个问题不仅在数学领域有广泛的应用,在计算机科学、算法设计等方面也具有重要意义。 #### 二、题目描述及...
在描述中,我们看到这是一道关于算法的题目,具体是询问给定正整数有多少种不同的划分方式。 问题描述明确指出,当给定的正整数为n时,例如n等于3,那么可以有以下几种划分方法: 1. 3(直接用原数) 2. 1+2(两个...
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\) 个非空集合的方法...
- 第一行:一个正整数n,表示有n种不同的钱币。 - 第二行:n个数,表示每种钱币的面值。 - 第三行:n个数,表示每种钱币的数量。 - 第四行:一个数m,表示目标面值。 2. **求解过程**:采用递归的方式,利用...
写一个程序,从标准输入上读入一个正整数N(1 ),计算出N元人民币兑换成1分、2分和5分的硬币,有多少种可能的组合。将结果以整数的方式输出到标准输出上,占一行。【输入形式】 正整数N。(1 ) 【输出形式】 整数。
在编程领域,阶乘是一个常见的数学概念,通常用于计算组合数和概率问题。在Java中,我们可以使用循环或递归的方式来实现求解任意正整数的阶乘。本篇文章将详细探讨如何用Java来计算阶乘。 首先,我们需要理解阶乘的...