- 时空限制1s / 128MB
题目描述
楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入输出格式
输入格式:
一个数字,楼梯数。
输出格式:
走的方式几种。
输入输出样例
说明
用递归会太慢,需用递推
(60% N<=50 ,100% N<=5000)
----------------------------------------------------------------------------------------------------
既然会打高精了,就应该会用高精做题
注意n==0时走法数为0 (讲道理不走也算是一种走法吧)
AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #define maxn 5010 5 using namespace std; 6 struct BigNum{ 7 int s[2333],len; 8 BigNum(){len=1;memset(s,0,sizeof(s));} 9 }; 10 BigNum f[maxn]; 11 int n; 12 void add(BigNum*,BigNum*,BigNum*); 13 int main(){ 14 scanf("%d",&n); 15 if(n==0){ 16 printf("0"); 17 return 0; 18 } 19 f[0].s[1]=1; 20 f[1].s[1]=1; 21 for(int i=2;i<=n;i++) add(&f[i-1],&f[i-2],&f[i]); 22 for(int i=f[n].len;i>0;i--) 23 printf("%d",f[n].s[i]); 24 return 0; 25 } 26 void add(BigNum *x,BigNum *y,BigNum *z){ 27 z->len=max(x->len,y->len); 28 for(int i=1;i<=z->len;i++){ 29 z->s[i]+=x->s[i]+y->s[i]; 30 z->s[i+1]=z->s[i]/10; 31 z->s[i]%=10; 32 } 33 if(z->s[z->len+1]) z->len++; 34 }