本帖最后由 蓝色小宇宙 于 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;
 
 -         }
 
 - }
 
 
  复制代码 
 
 
 
 
 
 
 |