洛谷P1255数楼梯题解 高精度递推实现方法 附C++代码注释
6个月前 (06-06)
题目解读
洛谷P1255是一道经典的递推题目,要求计算n阶楼梯的不同走法数,每次可以跨1阶或2阶。题目难点在于当n很大时(n≤5000),需要用高精度计算来处理大数结果。
解题思路
发现递推规律:f(n) = f(n-1) + f(n-2)
使用三个数组模拟高精度加法运算
通过进位标志处理大数相加
优化输出前导零的处理逻辑
解题步骤
初始化前三个台阶的结果(0阶1种,1阶1种,2阶2种)
循环n-3次进行递推计算
每次计算处理进位和数组更新
反转数组并去除前导零输出结果
代码实现
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int a1[1100]={2}; // 存储f(n-2)的结果
int a2[1100]={3}; // 存储f(n-1)的结果
int a3[1100]={0}; // 存储当前计算结果
int main(){
int n;
cin>>n;
if(n<=3){ // 边界条件处理
cout<<n;
return 0;
}
for(int i=0;i<n-3;i++){ // 递推n-3次
bool add=0; // 进位标志
for(int i=0;i<1100;i++){
a3[i]=a1[i]+a2[i]+add; // 高精度加法
add=a3[i]/10; // 计算进位
a3[i]%=10; // 保留个位数
}
// 更新前两个状态
for(int i=0;i<1100;i++)a1[i]=a2[i];
for(int i=0;i<1100;i++)a2[i]=a3[i];
}
// 处理输出
string tmp="";
for(int i=0;i<1100;i++)tmp+=a3[i]+'0';
reverse(tmp.begin(),tmp.end()); // 反转数组得到正确顺序
bool is_out=false;
for(int i=0;i<(int)tmp.size();i++){
if(tmp[i]!='0')is_out=true; // 跳过前导零
if(is_out)cout<<tmp[i];
}
return 0;
}总结
本题展示了递推与高精度结合的典型解法,通过数组模拟大数运算,解决了传统数据类型无法处理的大数问题。这种思路可以推广到其他需要处理大数的递推场景。
原创内容 转载请注明出处


