【洛谷】P1255 数楼梯(高精度斐波那契数列)

一、题目:

数楼梯

题目描述

楼梯有 $N$ 阶,上楼可以一步上一阶,也可以一步上二阶。

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

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

样例 #1

样例输入 #1

4

样例输出 #1

5

提示

  • 对于 $60\%$ 的数据,$N \leq 50$;
  • 对于 $100\%$ 的数据,$1 \le N \leq 5000$。

二、思路:

分析易得,是斐波那契数列的高精度运算。
我们用递推来写
递推核心:

for(int i =2;i<=n;i++)
{
    c=a+b;
    a=b;
    b=c;//次序不能改
}

后使用高精度加法:

void add() {
    int carry = 0;
    //处理c
    for (int i = 0; i < lc; i++) {
        c[i] = a[i] + b[i] + carry;
        carry = c[i] / 10;
        c[i] = c[i] % 10;
    }
    if (carry > 0) {
        c[lc] = carry;
        lc++;
    }
    //处理a,b
    for (int i = 0; i < lc; i++) {
        a[i] = b[i];
        b[i] = c[i];
    }
}

三、源码:

#include <iostream>
using namespace std;

#define N 5005
int a[N], b[N], c[N], lc = 1;

void add() {
    int carry = 0;
    //处理c
    for (int i = 0; i < lc; i++) {
        c[i] = a[i] + b[i] + carry;
        carry = c[i] / 10;
        c[i] = c[i] % 10;
    }
    if (carry > 0) {
        c[lc] = carry;
        lc++;
    }
    //处理a,b
    for (int i = 0; i < lc; i++) {
        a[i] = b[i];
        b[i] = c[i];
    }
}

int main() {
    int n;
    cin >> n;

    a[0] = 1;
    b[0] = 1;
    if (n == 1 || n == 0)
        cout << 1;
    else {
        for (int i = 2; i <= n; i++) {
            add();
        }
        for (int i = lc - 1; i >= 0; i--)
            cout << c[i];
    }

    return 0;
}

欢迎改正与补充

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇