超级台阶http://acm.nyist.net/JudgeOnline/problem.php?pid=76
超级台阶
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?
注:规定从一级到一级有0种走法。
- 输入
- 输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数。
- 输出
- 对于每个测试实例,请输出不同走法的数量。
- 样例输入
-
2 2 3
- 样例输出
-
1 2
- 来源
- [苗栋栋]原创
- 上传者
- 苗栋栋
-
#include<stdio.h> int fun(int d,int a,int b) { int c; c=a+b; a=b; b=c; d-=1; if(d==0) return c; else if(d>0) c=fun(d,a,b); } int main() { int a,b,n; scanf("%d",&n); while(n--) { int a,b,t,m,count; scanf("%d",&m); if(m==1) count=0; else if(m==2||m==3) count=m-1; else { a=1; b=2; m=m-3; count=fun(m,a,b); } printf("%d\n",count); } return 0; }
以前好像见过这种类型的题,写几组数据就找到了规律,就是大于3时,第n个数的个数是前两个个数之和。递归那块可以被
while(n-3>0){
count=a+b;
a=b;
b=count;
m--;
}
代替。
#include<stdio.h> int main() { int a,b,n; scanf("%d",&n); while(n--) { int a=1,b=2,t,m,count; scanf("%d",&m); if(m==1) count=0; else if(m==2||m==3) count=m-1; else { while(m-3>0) { count=a+b; a=b; b=count; m--; } } printf("%d\n",count); } return 0; }