数楼梯(洛谷p1255)

题目链接:P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题用的是典型的递推思想,可以倒着来想,比如要走到1000个台阶,那前一步一定就在999或者998,那走到1000的方法数就等于走到999的方法数加上998的方法数。同理,999的=998加997,好,其实那这个就是咱们高中学过的斐波那契数列(你不知道也没关系,反正就是一项等于前两项和),生兔子问题。

好,这道题思路已经有了,那我们就能很简单的写出代码

#include<iostream>
using namespace std;
long long a[5000];
int main() {
	int n;
	a[0] = 1;
	a[1] = 2;
	cin >> n;
	for (int i = 2; i < n; i++) {
		a[i] = a[i - 1] + a[i - 2];
	}
	cout << a[n - 1];
	return 0;
}

那问题真的解决了吗?

什么问题呢,其实是因为兔子生的比较快(斐波那契数量变化非常剧烈),超出了longlong的范围,所以我们应该怎么解决呢,答案就是高精度加法,高精度加法实际就是模拟加法的一个过程,然后用字符串类型来表示,然后把进位什么的都模仿一下,就可以了

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string a[5000];
int main() {
	int n;
	cin >> n;
	a[0] = "1";
	a[1] = "2";
	for (int i = 2; i < n; i++) {
		int end1 = a[i - 1].size()-1;
		int end2 = a[i - 2].size()-1;
		int next = 0;
		while (end1 >= 0 || end2 >= 0) {
			int x1 = end1 >= 0 ? a[i-1][end1--] - '0' : 0;
			int x2 = end2 >= 0 ? a[i - 2][end2--] - '0':0;
			int x = x1 + x2 + next;
			next = x / 10;
			x = x % 10;
			a[i] += (x + '0');
		}
		if (next == 1) {
			a[i] += "1";
		}
		reverse(a[i].begin(), a[i].end());
	}
	cout << a[n - 1];
	return 0;
}

其中这部分就是高精度加法的一个模拟过程,reverse的作用就是反转begin到end之间的顺序,不懂的家人们可以列几个数带进去是一下,比如123加12345。。

总结一下,这道题的难度两个点,一个是观察出来是斐波那契,另一个是要会写高精度加法,把这两个知识点掌握,这道题就迎刃而解了

如果有帮助还请点个赞,有问题的话可以评论捏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值