题目描述
楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
走的方式几种。
输入输出样例
输入 #1
4
输出 #1
5
说明/提示
60% N<=50
100% N<=5000)
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
string add(string a,string b) //高精度加法
{
int c[10000]={0},d[10000]={0},cnt=0,cnt1=0; //数组开大点
for(int i=a.length()-1;i>=0;i--) //字符串a存到c数组
c[cnt++] = a[i]-'0';
for(int i=b.length()-1;i>=0;i--)//字符串b存到d数组
d[cnt1++] = b[i]-'0';
int len=max(a.length(),b.length());
string ans;
int carry=0;
for(int i=0;i<len;i++) //开始对位相加
{
int sum=c[i]+d[i]+carry;
ans += (sum%10)+'0';
carry = sum/10;
}
if(carry) ans+=carry+'0';
reverse(ans.begin(),ans.end()); //最后倒置一下
return ans; //返回答案
}
int main()
{
int n;
string s[5100]={"","1","2"}; //字符串数组,为了下标对应,第0个""
cin>>n;
if(n==0) cout<<0; //某个测试点
else if(n==1 || n==2) cout<<s[n];
else
{
for(int i=3;i<=n;i++) //递推
s[i] = add(s[i-1],s[i-2]);
cout<<s[n];
}
return 0;
}