前言
经过 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;
}