1 条题解
-
0
【例48.1】 斐波那契数列
解题思路
本题第一项为0,第二项为1。滚动维护相邻两项,每次相加推进,输出第n项。用十进制字符串相加可避免未给上界时的整数溢出。
正确性说明
按顺序完成所述运算后,每个输入元素都被处理在相应位置或统计项中。保存的中间状态与已处理数据对应,最终输出与题目定义一致。
易错点
不是把F0作为第0项后直接输出Fn;样例第4项为2。
复杂度
若最大项D位,时间O(nD),空间O(D)。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; string addBig(string a, string b) { string s; int i = a.size() - 1, j = b.size() - 1, c = 0; while (i >= 0 || j >= 0 || c) { int t = c; if (i >= 0) t += a[i--] - '0'; if (j >= 0) t += b[j--] - '0'; s += char('0' + t % 10); c = t / 10; } reverse(s.begin(), s.end()); return s; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; string a = "0", b = "1"; for (int i = 1; i < n; i++) { string c = addBig(a, b); a = b; b = c; } cout << a << "\n"; return 0; }