P1255 数楼梯【斐波那契数列、高精度】
题目描述
楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
走的方式几种。
输入输出样例
输入
4
输出
5
说明/提示
60% N<=50
100% N<=5000)
解题思路
这道题目自己先手动算出前几个答案,会发现是一个斐波那契数列。
不过简单分析也可得知这是一个斐波那契数列(其中Fibo[n]表示第n阶楼梯的走法总数):
对于第n阶楼梯可以有两种状态得来:先走n-1阶然后走一步,以及走n-2阶然后走两步,即Fibo[n-1]+Fibo[n-2]。
这里要注意的数据量很大,要用高精度加法。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int Fibo[5010][5010] = { {1,0},{1,1},{1,2} }; //其中Fibo[i][0]为当前位的位数
void add(int n)
{
int c = 0; //进位位
int i;
int len = max(Fibo[n - 1][0], Fibo[n - 2][0]);
for (i = 1; i <= len; i++)
{
int sum = Fibo[n - 1][i] + Fibo[n - 2][i] + c;
Fibo[n][i] = sum % 10;
c = sum / 10;
}
if (c != 0)
{
Fibo[n][i] = c;
Fibo[n][0] = i;
}
else
{
Fibo[n][0] = i - 1;
}
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 3; i <= n; i++)
{
add(i);
}
for (int i = Fibo[n][0]; i >=1 ; i--)
{
printf("%d", Fibo[n][i]);
}
return 0;
}

浙公网安备 33010602011771号