原题链接:
https://www.luogu.com.cn/problem/P1255
题目描述
楼梯有 NN 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例:
输入#1
4
输出#1
5
说明/提示
- 对于 60% 的数据,N≤50;
- 对于 100% 的数据,N≤5000。
思路方法:
本题表面上看是一个类似斐波那契数列的递推类问题,实则还暗含了高精度的思想,由于所给N的范围较大,即使使用long long类型或者是unsigned long long类型,依旧会数据溢出。
那该怎么解决这类问题呢?⁉️
其实高精度加法可以借助数组来进行计算。下面是AC代码。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxN = 5005;
struct BigInt{
int len;
int num[maxN];
BigInt operator + (const BigInt & it){//重载 + 运算符
BigInt res;
res.len = fmax(len, it.len);//取较大数的位数
memset(res.num, 0, sizeof(res.num));//num数组置0
for(int i = 1; i <= res.len; i++){//对应位置上的数字相加
res.num[i] = num[i] + it.num[i];
}
for(int i = 1; i <= res.len; i++){//进位操作
res.num[i + 1] += res.num[i] / 10;//左边为低位,右边为高位 ,向右进位。
res.num[i] %= 10;
}
if(res.num[res.len + 1]){//检查最终数位是否增加,例如99 + 2 = 101 变为3位数
res.len++;
}
return res;
}
}f[maxN];
int main(){
int n;
cin>>n;
for(int i = 0; i <= 2; i++){//设置边界值
f[i].len = 1;
f[i].num[1] = i;
}
for(int i = 3; i <= n; i++){//自底向上累加
f[i] = f[i - 1] + f[i - 2];
}
for(int i = f[n].len; i >= 1; i--){//倒序输出结果
cout<<f[n].num[i];
}
return 0;
}