【问题标题】:Negative output in Fibonacci sequence斐波那契数列的负输出
【发布时间】:2017-05-15 09:54:57
【问题描述】:

尽管使用了 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

【问题讨论】:

  • 整数溢出。
  • 顺便说一句,这是未定义的行为。

标签: c++ visual-c++


【解决方案1】:

试试这个代码:

#include<iostream>
using namespace std;

int main()
{
    cout<<"Enter Number:";
    unsigned long long int x;
    cin>>x;
    unsigned long long int a=0,b=1,c;
    cout<<a<<"\t"<<b;
    for(int i=0;i<x;i++)
    {
        c=a+b;
        cout<<"\t"<<c;
        a=b;
        b=c;
       return 0;
    }

}

【讨论】:

    【解决方案2】:

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

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

    首先,为了防止负面影响,您可以使用 unsigned long int 使您的所有结果都为正,并提供对“稍微”更大的数字进行建模的能力。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2015-01-04
      相关资源
      最近更新 更多