题解:洛谷 P1255 数楼梯
【题目来源】
洛谷:P1255 数楼梯 - 洛谷 (luogu.com.cn)
【题目描述】
楼梯有 \(N\) 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
【输入】
一个数字,楼梯数。
【输出】
输出走的方式总数。
【输入样例】
4
【输出样例】
5
【解题思路】

【算法标签】
《洛谷 P1255 数楼梯》 #高精度# #递推# #斐波那契,Fibonacci#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
// 定义全局变量:
// n - 要计算的斐波那契数列项数
// a, b, c - 用于存储大数的数组,初始化为{1}(表示数字1)
// len - 当前数字的位数,初始为1
int n, a[5005] = {1}, b[5005] = {1}, c[5005] = {1}, len = 1;
// 函数f:计算斐波那契数列的下一项(大数加法)
void f()
{
int jw = 0; // 进位标志,初始为0
// 逐位相加
for (int i=0; i<len; i++)
{
// 当前位的和 = a的当前位 + b的当前位 + 上一位的进位
c[i] = a[i] + b[i] + jw;
// 计算新的进位
jw = c[i] / 10;
// 保留个位数
c[i] = c[i] % 10;
}
// 处理最高位的进位
if (jw!=0)
{
c[len] = jw;
len++; // 数字长度增加
}
// 更新a和b的值,为下一次计算做准备
// a = b (前一个数)
// b = c (当前计算出的数)
for (int i=0; i<len; i++)
{
a[i] = b[i];
b[i] = c[i];
}
}
int main()
{
// 输入要计算的斐波那契数列项数n
cin >> n;
// 特殊情况处理:当n=1时直接输出1
if (n == 1) {
cout << 1;
return 0;
}
// 从第2项开始计算,直到第n项
for (int i=2; i<=n; i++) {
f();
}
// 逆序输出结果(因为数组是低位在前存储的)
for (int i=len-1; i>=0; i--) {
cout << c[i];
}
return 0;
}
【运行结果】
4
5
浙公网安备 33010602011771号