尽管使用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位宽,也可能不是,C++标准不保证这样做(出于充分的理由)。如果我看到您的结果,对我来说好像是32位。
首先,为了防止出现负数,可以使用unsigned long int,这会使所有结果都为正,并能够“稍微”建模更大的数字。
但是,如果您通过第47个斐波那契数,则您仍然会得到错误的结果,因为您的数据类型仍然太小。要解决此问题,您可以使用unsigned long long或uint64_t。
请记住,即使对于这样的大型数据类型,也可以表示最多约一个数字。在第89次迭代时,有18万亿/万亿(10 ^ 18)的斐波那契数超过了此数。
关于c++ - 斐波那契数列的负输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41407390/