题目:对登上2022阶台阶有多少种方法;
小明对于上楼梯的事情很感兴趣。他每一次可以上1阶或2阶, 他想知道他登上2022阶台阶有多少种方法。 [ 8954654] (答案需要对1e9+7(1000000007)取模,如计算初始结果为:1000000008,请返回1。)
用BigInteger来算大数;
import java.math.BigInteger;
import java.util.Scanner;
public class ClimbStairs {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
System.out.println(ClimbStairs.climbStairs3(n));
//861314339
}
public static BigInteger climbStairs1(int n) {
//用递归暴力解法
//当楼梯阶数很大的时候就会因为时间的问题算不出来
if (n == 1) {
return BigInteger.valueOf(1);
} else if (n == 2) {
return BigInteger.valueOf(2);
} else {
return climbStairs1(n - 1).add(climbStairs1(n - 2));
}
}
public static BigInteger climbStairs2(int n) {
//是斐波拉契数列,分析案例;
if (n == 1) return BigInteger.valueOf(1);
BigInteger a = BigInteger.valueOf(1);
BigInteger b = BigInteger.valueOf(2);
BigInteger c;
for (int i = 3; i <= n; ++i) {
c = a.add(b);
a = b;
b = c;
}
//对1000000007取模
return b.mod(BigInteger.valueOf(1000000007));
}
public static BigInteger climbStairs3(int n) {
//这里大小根据自己需要,或者使用 List 也可以
BigInteger[] dp = new BigInteger[100000];
dp[1] = BigInteger.valueOf(1);
dp[2] = BigInteger.valueOf(2);
for( int i = 3;i <= n;++i ){
dp[i] = dp[i-1].add(dp[i-2]);
}
return dp[n].mod(BigInteger.valueOf(1000000007));
}
}



