0
点赞
收藏
分享

微信扫一扫

洛谷日常刷题

非常帅气的昵称吧 2022-04-26 阅读 99

前言

经过 AcWing 算法基础课的熏陶,算法正式入门,在此记录洛谷刷题记录,此后计划,提高课学习 + 基础课复习 + 提高课看到哪一点,刷哪一点的题。

1-4 递推与递归

P1255 数楼梯

题目描述

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

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

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

输入输出样例

输入

4

输出 

5

说明/提示

  • 对于 60% 的数据,N≤50;
  • 对于 100% 的数据,1≤N≤5000。

思路斐波那契数列(Fibonacci sequence),递推来解,需要注意的是,N <= 5000,结果是很大的一定能会超过 long long ,所以 高精度加法 用一下就好

代码如下

#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <map>

using namespace std;

const int N = 2e5+10;

int n;

string add(string a, string b)
{
    if(a.size() < b.size()) return add(b, a);

    string c;
    int t = 0, cnt = 0;
    for(int i = 0; i < a.size(); i ++ )
    {
        t += a[i] - '0';
        if(i < b.size()) t += b[i] - '0';
        c += t % 10 + '0';
        t /= 10;
    }
    if(t) c += t + '0';

    return c;
}

int main()
{
    scanf("%d", &n);
    if(n == 1)
    {
        printf("1\n");
        return 0;
    }
    if(n == 2)
    {
        printf("2\n");
        return 0;
    }

    string a = "1", b = "2", c;
    for(int i = 3; i <= n; i ++ )
    {
        c = add(a, b);
        a = b;
        b = c;
    }

    for(int i = c.size() - 1; i >= 0; i -- )
        printf("%c", c[i]);

    return 0;
}


举报

相关推荐

0 条评论