本帖最后由 蓝色小宇宙 于 2016-3-30 03:20 编辑
重新修改了下代码,不知道对不对,结果是8507815389127种,因为超出了int的范围,所以用的是BigInteger来做的- import java.math.BigInteger;
- import java.util.HashMap;
- import java.util.Set;
- public class Test4 {
- public static void main(String[] args) {
- /*
- * 有一个40层阶梯,每次只能迈1阶或者2阶,问有多少种迈法.
- * 由n*1 + m*2 = 40;,0 <= n <= 40, 0 <= m <=40/2
- * 获取n和m值后,存入集合里,再遍历判断每个键值对里面有多少种组合排序方式即迈步方式,数学思想是排列组合
- */
-
- //创建HashMap集合来存放n,m的值
- HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
- //遍历n
- for (int n = 0; n <= 40; n++) {
- if ((40 - n) % 2 == 0) {
- hm.put(n,(40-n)/2);
- }
- }
- getSum(hm);
- }
- private static void getSum(HashMap<Integer, Integer> hm) {
- //获取集合hm的键集合
- Set<Integer> key = hm.keySet();
- //声明一个变量来记住每个键值对的迈步方式的和
- BigInteger sum = new BigInteger("0");
- //遍历键集合
- for (Integer in : key) {
- //获取每个键所对应的值
- int m = hm.get(in);
- //打印迈1步与迈2步的键值对
- System.out.print("(" + in.intValue() + "," + m + ") ");
- //调用getMethod()方法,获取每个键值对的迈步方式总和,并打印出来
- System.out.println("这个组合的迈步方式有" + getMethod(in.intValue(),m) + "种");
- //将每个键值对的迈步方式总和叠加,遍历完集合后即可得到所有键值对的迈步和
- sum = sum.add(getMethod(in.intValue(),m));
- }
- //打印总和结果
- System.out.println("总的迈步方式有" + sum + "种.");
- }
- //定义一个限定条件的阶乘的方法以获取每个键值对的迈步方式的和 (数学中排列组合的方法)
- private static BigInteger getMethod(int in, int m) {
- //计数器
- int count = 0;
- //声明一个变量初始化为1,记录阶乘的结果
- BigInteger sum = new BigInteger("1");
- //获取两个数里的最大值与最小值
- int max = Math.max(in, m);
- int min = Math.min(in, m);
- //阶乘,直到计数器等于最小值时停止
- while(count != min) {
- //阶乘
- sum = sum .multiply(new BigInteger(max + 1 + ""));
- //每次max减1,以达到阶乘效果
- max--;
- //计数器加1
- count++;
- }
- return sum;
- }
- }
复制代码
|