【发布时间】:2019-09-06 07:28:44
【问题描述】:
我使用记忆来减少完成递归斐波那契所需的时间。
但问题是它会导致整数溢出,因此在第 50 个数字之后数字不会被完成。
那么如何在递归和迭代中防止整数溢出?
我听说操作符重载可以解决它..?但我不知道该怎么做。
int recursiveFib(int n) {
if (n <= 1)
return n;
else if (memo[n]!=0)
return memo[n];
else
return memo[n] = recursiveFib(n - 1) + recursiveFib(n - 2);
}
int iterativeFib(int n) {
int x = 0, y = 1, z = 0;
for (int j = 0; j < n; j++) {
z = x + y;
x = y;
y = z;
}
return x;
}
int main() {
for (int n=0; n<=200; n+=10){
cout << "when n equals to " << n << ", Recursive Fibonacci : \n";
for (int i = 0; i <= n; i++) {
cout << recursiveFib(i)<<" ";
}
for (int n = 0; n <= 200; n += 10) {
cout << "when n equals to " << n << ", Iterative Fibonacci : \n";
for (int i = 0; i <= n; i++) {
cout << iterativeFib(i) << " ";
}
}
结果应该是每增加一个 n+10 打印斐波那契,在 30 分钟内递归和迭代。
【问题讨论】:
-
第 200 个斐波那契数是 453973694165307953197296969697410619233826,大约 2^138。 C++ 标准库提供的最大数字是 uint64_t,即 2^64。如果你想处理更大的数字,你需要一个任意精度的库,比如 libgmp。
-
仅供参考,因为您使用的唯一操作是加法,所以自己实现大数非常容易(如
vector<int>)。不需要重新发明轮子,但是,1)它可能是一个有用的经验; 2)如果它是一个任务,实现大数字可能是其中的一部分。
标签: c++ int fibonacci integer-overflow