题目链接: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。。
总结一下,这道题的难度两个点,一个是观察出来是斐波那契,另一个是要会写高精度加法,把这两个知识点掌握,这道题就迎刃而解了
如果有帮助还请点个赞,有问题的话可以评论捏