【洛谷】P1255 数楼梯(高精度加法+斐波那契数列)题解

【洛谷】P1255 数楼梯(高精度加法+斐波那契数列)题解

原题地址:https://www.luogu.org/problem/P1255

题目背景

数楼梯

题目描述

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

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

输入输出格式

输入格式:

一个数字,楼梯数。

输出格式:

走的方式几种。

输入输出样例

输入样例#1:

4

输出样例#1:

5


说明

时空限制: 1000ms/128MB
60% N<=50
100% N<=5000

思路:
这是一道斐波那契数列题,走楼梯,要么一次走一格,要么一次走两格,则每次的走法 = 上一格的方案数 + 上上格的方案数,但是由于数很大,所以需要用到高精度加法。用二维数组f[m][i]表示m阶台阶对应的走法数,而i表示数位。

斐波那契数列递推公式:F[i] = F[i-1] + F[i-2]


代码如下:

#include <iostream>
#include <cstdio> 
using namespace std;
int f[5050][5050],len=1;	//f[m][i]表示m阶台阶对应的走法数,i表示数位 
void hpa(int m)	//高精度加法,m表示阶数 
{
	for(int i=1;i<=len;i++)
		f[m][i]=f[m-1][i]+f[m-2][i];	//套用斐波那契数列递推公式 
	for(int i=1;i<=len;i++)	//遍历每一个数位 
	{
		if(f[m][i]>=10)	//如果该数位大于等于10则进位 
		{
			f[m][i+1]+=f[m][i]/10;
			f[m][i]%=10;
			if(f[m][len+1])	//如果进位后方法数不为0则位数加1 
				len++;
		}
	}
}
int main() 
{
	int n;
	scanf("%d",&n);
	f[1][1]=1;	//一阶有一种 
	f[2][1]=2;	//二阶有两种 
	for(int i=3;i<=n;i++)
		hpa(i);		//调用高精度加法的函数 
	for(int i=len;i>=1;i--)	//倒序输出 
		printf("%d",f[n][i]);
	return 0;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值