【问题标题】:Recursive Fibonacci with integer overflow具有整数溢出的递归斐波那契
【发布时间】: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&lt;int&gt;)。不需要重新发明轮子,但是,1)它可能是一个有用的经验; 2)如果它是一个任务,实现大数字可能是其中的一部分。

标签: c++ int fibonacci integer-overflow


【解决方案1】:

第 200 个斐波那契数(甚至第 50 个)大于 2^32(int 限制)。我建议你使用unsigned long long 而不是int,或者甚至使用数组创建一个大整数类型,比如here

【讨论】:

  • 20th 或 200th 差别很大
【解决方案2】:

在将两个数字相加之前(在迭代 x、y 和递归方法的返回值中),应该检查加法是否会导致整数溢出。 欲了解更多信息,请查看此post。它可能会帮助您弄清楚。

【讨论】:

    【解决方案3】:
    #include<boost/multiprecision/cpp_int.hpp>
    
    using namespace boost:: multiprecision;
    
     // just add these two lines , now you can use big int type of size 2^1024
    
    //Declaration as same as normal int
    
    int1024_t  X=0; // can holds values upto 2^1024
    

    【讨论】:

      猜你喜欢
      • 2016-04-02
      • 2014-11-14
      • 2010-12-03
      • 2012-05-06
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多