洛谷P1255数楼梯题解 高精度递推实现方法 附C++代码注释
23小时前
题目解读
洛谷P1255是一道经典的递推题目,要求计算n阶楼梯的不同走法数,每次可以跨1阶或2阶。题目难点在于当n很大时(n≤5000),需要用高精度计算来处理大数结果。
解题思路
解题步骤
初始化前三个台阶的结果(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; }
总结
本题展示了递推与高精度结合的典型解法,通过数组模拟大数运算,解决了传统数据类型无法处理的大数问题。这种思路可以推广到其他需要处理大数的递推场景。
原创内容 转载请注明出处