高精度递推-斐波那契数

题目
一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房 m开始爬到蜂房 n,m<n,有多少种爬行路线?(备注:题面有误,右上角应为 n-1)
在这里插入图片描述

题目分析
每个方块可以由相邻且小于该数的方块转移,例如当n=1 m=4时方案数为 由1到3的方案,加上由1到2的方案,这样的原因是因为2与3有且只有一步到达目的地4
我们很容易可以想到斐波那契数列,用一维数组f[n]来储存由起点到距离n位置的方案数,答案就是f[n-m].
分析易得f[0]=0,f[1]=1,f[2]=2;得到递推式子f[n]=f[n-1]+f[n-2];
但是当n的值过大时方案数将会爆longlong,所以可以使用高精度加法来实现这一过程.如代码所示

#include<iostream>
using namespace std;
int f[1005][1005],len=1;//第一维代表数字,第二维代表数字的每一位数如f[2][1]=2代表第f[2]的个位为2
void add(int x)//二维数组高进度加
{
	for (int i = 1; i <= len; i++)
		f[x][i] = f[x - 1][i] + f[x - 2][i];//处理每一位数加
	for (int i = 1; i <= len; i++)//从个位开始处理进位
		if (f[x][i] > 9)
		{
			f[x][i + 1] += f[x][i] / 10;
			f[x][i] %= 10;
		}
	if (f[x][len + 1]) len++;//判断数的位数是否边长
}
int main()
{
	int n,m;
	cin >> n >> m;
	f[0][1]=0,f[1][1] = 1, f[2][1] = 2;
	for (int i = 3; i <= m-n; i++)
	{
		add(i);
	}
	for (int i = len; i >= 1; i--)
		cout << f[m-n][i];
    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值