【问题标题】:fibonacci sequence overflow, C++斐波那契数列溢出,C++
【发布时间】:2021-11-30 06:13:21
【问题描述】:

我想打印斐波那契数列中的前 100 个数字。我的程序打印出大约 20 个数字,然后数字变为负数。

有人可以向我解释一下并提供解决方法吗?

谢谢,

/*Fibonacci sequence*/

#include <iostream>

using namespace std;

int main(){
    long int i, fib;
    int firstNum=0, secondNum=1;

    cout << firstNum << endl; 
    cout << secondNum << endl;

    for (i=0; i < 100; i++){
        fib = firstNum + secondNum;
        firstNum = secondNum;
        secondNum = fib;
        cout << fib << endl;
    }

    return 0;
}

【问题讨论】:

  • int 可以存储的最大值为 +2147483647。尝试使用unsigned long long,即使那样我认为你可能会在达到 100 之前溢出。
  • 在第 20 个 fabonacci num 之后,它跨越了 int 的范围,你可以使用 long long int 但它也将存储到第 91 个 fabonacci。因此您可以将它们逐位存储在数组中,也可以使用 Bigint。
  • @JonathanPotter int 可以存储的最大值至少 +2147483647。 int 可能大于 32 位。

标签: c++ fibonacci


【解决方案1】:

您看到的是整数溢出问题。 firstNum 和 secondNum 都不长。

这应该可以解决它

    unsigned long long i, fib;
    unsigned long long firstNum=0, secondNum=1;

编辑:

这将帮助您避免在第 20 个数字之后溢出,但您的程序仍然会溢出。您可以使用 unsigned long long,并且您将使其达到第 100 个序列元素。

【讨论】:

  • 在大多数 32 位机器上,sizeof(long) == 4
  • 它仍然会超出范围并且对于 64 位也很长。
  • 这是一个更好的说法 - 此修复将避免 许多 个数字的溢出,但斐波那契数列增长得非常快,我们仍然会遇到溢出。
【解决方案2】:

好吧,即使 unsigned long long int 超出范围以获得更高的 fabonacci num(92 以上),但如果仍然感兴趣,您可以将它们逐位存储在数组中

看到这个 https://docs.google.com/file/d/0BwtP9e5j1RbpSjhvSG4wbkhGcmM/edit

【讨论】:

    【解决方案3】:
    • 我们可以将值存储在动态创建的结构中,例如 作为链表(如果我们想存储所有斐波那契数)OR
    • 我们可以只使用三个字符串数组来保存 sum 和 temp 值来打印它,这将解决您的问题。

    请参阅此处以供参考

    Print nth Fibonacci number [upto 1000 digits]

    【讨论】:

      猜你喜欢
      • 2017-02-13
      • 2016-04-02
      • 1970-01-01
      • 2015-06-05
      • 2019-04-06
      • 2015-07-05
      相关资源
      最近更新 更多