我正在尝试学习 C,但我正在努力找出这个简单程序中的错误所在:
// variable length arrays.
#include <stdio.h>
int main (void)
{
int i, numFibs;
printf ("How many Fibonacci numbers do you want (between 1 and 75)? ");
scanf ("%i", &numFibs);
if (numFibs < 1 || numFibs > 75) {
printf ("Bad number, sorry!\n");
return 1;
}
unsigned long long int Fibonacci[numFibs];
Fibonacci[0] = 0;
Fibonacci[1] = 1;
for (i = 2; i < numFibs; ++i)
Fibonacci[i] = Fibonacci[i-2] + Fibonacci[i-1];
for (i = 0; i < numFibs; ++i)
printf ("%i %llu\n", i, Fibonacci[i]);
printf ("\n");
return 0;
}
该程序来自教科书《C 语言编程》。
为什么它会产生错误的序列:
How many Fibonacci numbers do you want (between 1 and 75)? 70
//删除了一些。
31 1346269
32 2178309
33 3524578
34 5702887
35 9227465
36 14930352
37 24157817
38 39088169
39 63245986
40 102334155
41 165580141
42 267914296
43 433494437
44 701408733
45 1134903170
46 1836311903
47 2971215073
48 512559680
49 3483774753
50 3996334433
51 3185141890
52 2886509027
53 1776683621
事情开始出错了。根据 http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html 48 应该是 4807526976 .
我认为它可能溢出了?但书中并没有对此发出警告。嗯...
最佳答案
原因:溢出。
请注意,4807526976 - 512559680 = 4294967296 = 2^32
,在您的平台上,unsigned long long
类型被认为是 32 位而不是 64 位。
解决方案:尝试使用较大的整数类型,例如 int64_t
(您可能需要包含 stdint.h
)或维护自己的高精度数据类型。
有关整数溢出的详细信息,请参阅 http://en.wikipedia.org/wiki/Integer_overflow
关于c - 在 C 中生成不正确的斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26842174/