黑马程序员技术交流社区

标题: 求解一道有趣的题 [打印本页]

作者: q312092921    时间: 2016-3-29 21:03
标题: 求解一道有趣的题
有一个40层阶梯,每次只能迈1阶或者2阶,问有多少种迈法.
哪个大神能提供一种算法?
作者: dxw    时间: 2016-3-29 21:56
本帖最后由 dxw 于 2016-3-29 22:01 编辑

public class Floor {
        public static void main(String[] args) {
                int count=0;//楼梯走法计数器
                for(int y=0;y<=20;y++) {//y为每次走2步的数量,用y控制x的值
                        int x=0;//x为每次一步的数量
                        int z=0
                        x=40-2*y;
                        z=x+y;        //每种可能一共走几次
                        count+=a(y,z);//计算并累加本次x,y组合的走法到count
                }
                System.out.println(count);//输出结果853090906
        }
        public static int a(int y,int z) {//计算本次x,y组合的走法
                int n=1;
                for(int m=0;m<y;m++,z--) {
                        n*=z;
                }
                return n;
        }
}



作者: 蓝色小宇宙    时间: 2016-3-29 22:31
本帖最后由 蓝色小宇宙 于 2016-3-30 03:20 编辑

重新修改了下代码,不知道对不对,结果是8507815389127种,因为超出了int的范围,所以用的是BigInteger来做的
  1. import java.math.BigInteger;
  2. import java.util.HashMap;
  3. import java.util.Set;

  4. public class Test4 {
  5.         public static void main(String[] args) {
  6.                 /*
  7.                  * 有一个40层阶梯,每次只能迈1阶或者2阶,问有多少种迈法.
  8.                  * 由n*1 + m*2 = 40;,0 <= n <= 40, 0 <= m <=40/2
  9.                  * 获取n和m值后,存入集合里,再遍历判断每个键值对里面有多少种组合排序方式即迈步方式,数学思想是排列组合
  10.                  */
  11.                
  12.                 //创建HashMap集合来存放n,m的值
  13.                 HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
  14.                 //遍历n
  15.                 for (int n = 0; n <= 40; n++) {
  16.                         if ((40 - n) % 2 == 0) {
  17.                                 hm.put(n,(40-n)/2);
  18.                         }
  19.                 }
  20.                 getSum(hm);
  21.         }

  22.         private static void getSum(HashMap<Integer, Integer> hm) {
  23.                 //获取集合hm的键集合
  24.                 Set<Integer> key = hm.keySet();
  25.                 //声明一个变量来记住每个键值对的迈步方式的和
  26.                 BigInteger sum = new BigInteger("0");
  27.                 //遍历键集合
  28.                 for (Integer in : key) {
  29.                         //获取每个键所对应的值
  30.                         int m = hm.get(in);
  31.                         //打印迈1步与迈2步的键值对
  32.                         System.out.print("(" + in.intValue() + "," + m + ")  ");
  33.                         //调用getMethod()方法,获取每个键值对的迈步方式总和,并打印出来
  34.                         System.out.println("这个组合的迈步方式有" + getMethod(in.intValue(),m) + "种");
  35.                         //将每个键值对的迈步方式总和叠加,遍历完集合后即可得到所有键值对的迈步和
  36.                         sum = sum.add(getMethod(in.intValue(),m));
  37.                 }
  38.                 //打印总和结果
  39.                 System.out.println("总的迈步方式有" + sum + "种.");
  40.         }
  41.         //定义一个限定条件的阶乘的方法以获取每个键值对的迈步方式的和        (数学中排列组合的方法)
  42.         private static BigInteger getMethod(int in, int m) {
  43.                 //计数器
  44.                 int count = 0;
  45.                 //声明一个变量初始化为1,记录阶乘的结果
  46.                 BigInteger sum = new BigInteger("1");
  47.                 //获取两个数里的最大值与最小值
  48.                 int max = Math.max(in, m);
  49.                 int min = Math.min(in, m);
  50.                 //阶乘,直到计数器等于最小值时停止
  51.                 while(count != min) {
  52.                         //阶乘
  53.                         sum = sum .multiply(new BigInteger(max + 1 + ""));
  54.                         //每次max减1,以达到阶乘效果
  55.                         max--;
  56.                         //计数器加1
  57.                         count++;
  58.                 }
  59.                 return sum;
  60.         }
  61. }
复制代码












欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2