题解:洛谷 P1255 数楼梯

【题目来源】

洛谷:P1255 数楼梯 - 洛谷 (luogu.com.cn)

【题目描述】

楼梯有 \(N\) 阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

【输入】

一个数字,楼梯数。

【输出】

输出走的方式总数。

【输入样例】

4

【输出样例】

5

【解题思路】

image

【算法标签】

《洛谷 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
posted @ 2026-02-17 16:13  团爸讲算法  阅读(11)  评论(0)    收藏  举报