一道递推+高精度算法的模板题,递推式还是比较好推的,因为到达第N层楼梯的最后一步有两种情况:
1、在N-1层楼梯跨一步
2、在N-2层楼梯跨两步
所以到达第N层楼梯的情况数就是两种情况相加,即f[n] = f[n-1] + f[n-2];
第二步就是高精度问题了,题目说明N<=5000,可以发现,第5000层的情况的数已经是个很大的数了,完全超过了long long的范围,而double精度是不精确的,所以要用到高精度算法,参考P1601.
模拟加法的运算,按位相加,进位的记录,可以开个字符串数组存储。
代码实现:
#include <bits/stdc++.h>
using namespace std;
string f[5005];
string add(string a, string b)//大整数加法
{
string ans;//存储答案的字符串
//位数
int la = a.size();
int lb = b.size();
int i, j, jin = 0//进位变量;
for(i = la-1, j = lb-1; i >= 0 && j >= 0; i--, j--)//按位相加
{
ans += (a[i]+b[j]-96+jin) % 10 + 48;
jin = (a[i]+b[j]-96+jin) / 10;
}
while(i >= 0)//如果a位数还有剩余
{
ans += (a[i]-48+jin) % 10 + 48;
jin = (a[i]-48+jin) / 10;
i--;
}
while(j >= 0)//如果b位数还有剩余
{
ans += (b[j]-48+jin) % 10 + 48;
jin = (b[j]-48+jin) / 10;
j--;
}
if(jin) ans += '0' + jin;//进位不为0处理
reverse(ans.begin(), ans.end());//答案倒置一下才对哦
return ans;//返回答案
}
int main()
{
int n, i;
cin >> n;
//初始化
f[0] = '0' + 0;//0竟然也要初始化。。
f[1] = '0' + 1;
f[2] = '0' + 2;
for(i = 3; i <= n; i++)
{
f[i] = add(f[i-1], f[i-2]);//递推
}
cout << f[n];//输出答案
}