题目描述
有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?
注:规定从一级到一级有0种走法。
输入 输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数。 |
样例输入 2 2 3 |
输出 对于每个测试实例,请输出不同走法的数量。 |
样例输出 1 2 |
解题思路:这个题目同样也是一个数列题目。不算第一级台阶,所以每次输入的时候,我都减了1,并提前对第一级台阶提前处理。当不是第一级台阶的时候,首先对2取整,算出数字包含2的个数,在对2取余,算出的是1的个数。这时候的题目就转换为了一个数学中组合问题。利用一个循环,算出2的取法,每次循环2的个数减一,相应的1的个数加2。说到这里应该就明白了我的思路了。。。
代码:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main {
public static long fac(int n){
if (n==0||n==1)
return 1;
else
return n*fac(n-1);
}
public static long minfac(int c,int n){
long sum = 1;
for(int i=0;i<n;i++)
sum*=(c-i);
//System.out.println(sum);
return sum;
}
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for(int i=0;i<N;i++){
int m = sc.nextInt()-1;
if(m==0){
System.out.println(0);
continue;
}
int count = 0;
int numOftwo = m/2;
int numOfone = m%2;
while(numOftwo>0){
count+=minfac(numOfone+numOftwo,numOftwo)/fac(numOftwo);
numOftwo--;
numOfone+=2;
}
count++;
System.out.println(count);
}
}
}
交上去之后,我又看了下大佬的代码,原来这个题目其实就是一个斐波那契数列。我尝试着列了一下:
1--0
2--2
3--3
4--5
5--8
···
过然满足斐波那契数列的规律。orz
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Main m = new Main();
while(sc.hasNext()) {
int num = sc.nextInt();
for(int i=0; i<num; i++) {
System.out.println(m.Fan(sc.nextInt()));
}
}
}
public int Fan(int n) {
if(n == 1) return 0;
if(n == 2) return 1;
if(n == 3) return 2;
return Fan(n-1)+Fan(n-2);
}
}