【洛谷刷题笔记】P1255 数楼梯(高精度斐波那契数列)
一、题目:
数楼梯
题目描述
楼梯有 N N N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
样例 #1
样例输入 #1
4
样例输出 #1
5
提示
- 对于 60 % 60\% 60% 的数据, N ≤ 50 N \leq 50 N≤50;
- 对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 5000 1 \le N \leq 5000 1≤N≤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;
}
欢迎改正与补充