洛谷P1255 数楼梯(递推+高精度 )

一道递推+高精度算法的模板题,递推式还是比较好推的,因为到达第N层楼梯的最后一步有两种情况: 

1、在N-1层楼梯跨一步

 2、在N-2层楼梯跨两步

所以到达第N层楼梯的情况数就是两种情况相加,即f[n] = f[n-1] + f[n-2]; 

第二步就是高精度问题了,题目说明N<=5000,可以发现,第5000层的情况的数已经是个很大的数了,完全超过了long long的范围,而double精度是不精确的,所以要用到高精度算法,参考P1601. 

模拟加法的运算,按位相加,进位的记录,可以开个字符串数组存储。 

代码实现:

#include <bits/stdc++.h>
using namespace std;

string f[5005];

string add(string a, string b)//大整数加法 
{
	string ans;//存储答案的字符串 
	//位数 
	int la = a.size();
	int lb = b.size();
	int i, j, jin = 0//进位变量;
	for(i = la-1, j = lb-1; i >= 0 && j >= 0; i--, j--)//按位相加 
	{
		ans += (a[i]+b[j]-96+jin) % 10 + 48;
		jin = (a[i]+b[j]-96+jin) / 10;
	}
	while(i >= 0)//如果a位数还有剩余 
	{
		ans += (a[i]-48+jin) % 10 + 48;
		jin = (a[i]-48+jin) / 10;
		i--;
	}
	while(j >= 0)//如果b位数还有剩余 
	{
		ans += (b[j]-48+jin) % 10 + 48;
		jin = (b[j]-48+jin) / 10;
		j--;
	}
	if(jin)	ans += '0' + jin;//进位不为0处理 
	reverse(ans.begin(), ans.end());//答案倒置一下才对哦 
	return ans;//返回答案 
}
int main()
{
	int n, i;
	cin >> n;
	//初始化 
	f[0] = '0' + 0;//0竟然也要初始化。。 
	f[1] = '0' + 1;
	f[2] = '0' + 2;
	for(i = 3; i <= n; i++)
	{
		f[i] = add(f[i-1], f[i-2]);//递推 
	}
	cout << f[n];//输出答案 
} 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值