题目描述
楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
说明
(60% N<=50 ,100% N<=5000)
题目解析
这边特意将题目中的数据规模写出来,对于60%的数据是小于50,但是对于100%的数据是小于5000,这边就是考虑到C++中的unsigned long long 是否可以存储这个大的数据量了,显然是存不了的,所以在这边我们需要用到高精度加法(使用python和java的忽略这个问题,java有大整数,python无视存储位数)
首先这道题扫一遍就知道是斐波那契数列的解法,我们可以先找一下递推公式。
如果N=1,只有一种走法
如果N=2,由两种走法,分别是1,1、2
如果N=3,由三种走法,分别是1,1,1、1,2、2,1
如果N=4,由五种走法,分别是1,1,1,1、1,2,1、1,1,2、2,1,1,2,2
…
至此,可以得到递推公式为f[i] = f[i-1] + f[i-2]。
代码实现
#include <iostream>
#include <string>
#include <cstring>
#define maxn 5005
using namespace std;
int a[maxn],b[maxn],c[maxn];
int main() {
int n,ns=1;
cin >> n;
if(n < 3){
cout << n << endl;
return 0;
}else{
a[1] = 1;b[1] = 2;
for(int i = 3; i <= n; i ++){
memset(c,0,sizeof(c));
for(int j = 1; j <= ns; j ++){
c[j] = a[j]+b[j];
}
for(int j = 1; j <= ns; j ++){
if(c[j] > 9){
c[j+1] += c[j]/10;
c[j] -= 10;
if(j+1 > ns){
ns ++;
}
}
}
for(int j = 1; j <= ns; j ++){
a[j] = b[j];
}
for(int j = 1; j <= ns; j ++){
b[j] = c[j];
}
}
}
for(int i = ns; i >= 1; i --){
cout << b[i];
}
cout << endl;
return 0;
}