c++ - 斐波那契数列的负输出

标签 c++ visual-c++

尽管使用 long int,但在斐波那契数列中添加大数时,我得到负输出。如何解决?

#include <iostream>
using namespace std;
void main() {

    long int sum = 2;
    long int f1 = 1, f2 = 2, f3;
    for (unsigned int i = 2; i < 4000000; i++) {
        f3 = f2 + f1;
        if (!(f3 % 2)) {
            sum += f3;
        }
        swap(f1, f2);
        swap(f2, f3);
    }
    cout << sum << endl;
}

输出为-1833689714

最佳答案

如你所见here第 47 个斐波那契数超出了 32Bit/4Byte 整数的范围。之后的一切都将变为负值。

对于您的程序,您使用的 long int 可能是 32 位或 64 位宽,也可能不是 32 位或 64 位宽,C++ 标准不保证(有充分的理由)。如果我看到你的结果,对我来说似乎是 32 位。

首先,为了防止出现负数,您可以使用 unsigned long int,这会使您的所有结果都为正,并且能够对“稍微”更大的数字进行建模。

但是,如果您传递第 47 个斐波那契数,您仍然会得到错误的结果,因为您的数据类型仍然太小。要解决此问题,您可以使用 unsigned long long 或 uint64_t。

请记住,即使是这样的大数据类型,也可以表示高达约的数字。 18 万亿/quintillion (10^18) 斐波那契数在第 89 次迭代时超过了这个值。

关于c++ - 斐波那契数列的负输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41407390/

相关文章:

visual-studio - Visual Studio 2012中来自外部项目的配置

c++ - 在 msvc Debug模式下,堆栈中有 cdcdcdcd 是否正常

python - 将 Boost Python 与 shared_ptr<const T> 一起使用

c++ - 如何在 C++ 中表达一系列数组位置?

c++ - 信息实际上并未存储在节点数组中

visual-c++ - C++/CLI Wrapper DLL TypeLoadException 字段太多

c++ - clang++ 3.1 但在 Lion Xcode 4.3.3 上没有 `cxx_lambdas`

c++ - 未处理的异常 C++ - VS2012

c++ - 通过USB传输数据

visual-studio-2010 - 默认情况下在 Windows Vista 上下文中运行的应用程序