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;
}

 

posted @ 2020-06-16 10:57  Hu_YaYa  阅读(95)  评论(0)    收藏  举报