题目:
楼梯有N阶,上楼可以一步上一阶,也可以一步上两阶。那么走到第N阶楼梯共有多少种不同的走法呢?
输入格式:
一个正整数 N(1<=N<=5000),表示楼梯阶数。
输出格式:
输出一个数,表示走到第N阶楼梯有多少种走法。
注意,数据范围很大,即使是64位也可能不够存。
输入样例1:
4
输出样例1:
5
输入样例2:
400
输出样例2:
284812298108489611757988937681460995615380088782304890986477195645969271404032323901
题意分析:
解题思路:
具体算法流程:
实现细节(代码):
#include<bits/stdc++.h>
using namespace std;
int n;
int t1,t2,t;
char n1[100000];
char n2[100000];
char n3[100000];
int jiafa(char a[100000],int aa,char b[100000],int bb) {
if(aa>=bb) t=aa;
else t=bb;
for(int j=1; j<=t; j++) {
if((b[j]+a[j]+n3[j])>=10) {
n3[j+1]=(n3[j]+a[j]+b[j])/10;
n3[j]=(n3[j]+a[j]+b[j])%10;
} else {
n3[j]+=a[j]+b[j];
}
}
if(n3[t+1]!=0) t++;
}
int main() {
cin>>n;
n1[1]=1;
t1=1;
n2[1]=2;
t2=1;
if(n>=3) {
for(int i=1; i<=n-2; i++) {
jiafa(n1,t1,n2,t2);
for(int j=1; j<=t2; j++) {
n1[j]=n2[j];
}
t1=t2;
for(int j=1; j<=t; j++) {
n2[j]=n3[j];
}
t2=t;
memset(n3,0,sizeof(n3));
}
for(int i=t2; i>=1; i--) {
printf("%d",n2[i]);
}
} else {
if(n==1) {
printf("1");
}
if(n==2) {
printf("2");
}
}
return 0;
}