【高精度】数楼梯
题目描述
楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
走的方式几种。
输入输出样例
输入 #1 复制
4
输出 #1 复制
5
说明/提示
60% N<=50
100% N<=5000)
分析
原本一看,这不是 斐波那契数列 吗,直接公式下去写完,(dp[i] = dp[i-1]+ dp[i-2];)
结果超时好多。。。。。其实这个题标注(高精度)那有这样就搞定的。。。
//int n;
//int dp[5005];
//int main(){
// cin>>n;
// dp[0]= 1;
// dp[1]= 1;
// for(int i=2;i<=n;i++){
// dp[i] = dp[i-1]+ dp[i-2];
// }
// cout<<dp[n]<<endl;
// return 0;
//}
由 斐波那契数列 得, c (i)= c(i-1)+c(i-2); 这里我们把c(i-1)当成a,c(i-2)当成b,c(i)当成c。
比如: a是第一阶,a=1(一种走法),b是第二阶,b=2(两种走法)…c是三阶,c = a+b = 3 (三种走法).
然后我们把b赋给a,c赋给b,(这时a是第二阶,b是第三阶)然后再执行一次 c = a+b;(c自然是第四阶)
由此类推,能得到 第n阶 有几种走法。
然后,我们把它换成高精度的写法,就ok了。。。。。。
代码
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 5005;
int a[maxn],b[maxn],c[maxn];
int n;
int main(){
a[1] =1;
b[1] =2;
cin>>n;
// c =a+b; b=c; a=b;
int lc=1;
for(int i=3;i<=n;i++){
//注意每次要先清0.
memset(c,0,sizeof(c));
for(int j=1;j<=lc;j++){
c[j] += a[j] +b[j];
c[j+1] += c[j]/10;
c[j] %= 10;
}
//a= b;
if(c[lc+1]>0)lc++;
for(int j=1;j<=lc;j++){
a[j] = b[j];
}
//b =c;
for(int j=1;j<=lc;j++){
b[j] = c[j];
}
}
if(n<3){
cout<<n<<endl;
return 0;
}
for(int i=lc;i>=1;i--){
cout<<c[i];
}
return 0;
}