在fib(47)之后,迭代Fibonacci算法给出了错误的结果

我正在使用我在下面复制的迭代fib算法。 我在Rosetta代码上找到了这个算法,它给了我正确的答案直到fib(46)。 之后它的价值观是错误的。 有谁知道为什么会这样?

long long fibb(int n) { int fnow = 0, fnext = 1, tempf; while(--n > 0) { tempf = fnow + fnext; fnow = fnext; fnext = tempf; } return fnext; } 

输出:

 Fib(46) = 1836311903 <---- Correct Fib(47) = 18446744092385799393 <---- Wrong (Correct Answer is: 2971215073) 

请注意,您在代码中使用int类型的临时变量,而不是键入long long int 。 这意味着如果你达到处理足够大的Fibonacci数的程度,你的代码中会出现整数溢出。 特别是,第47个Fibonacci数是2,971,215,073,它太大而不适合有符号的32位整数,所以你会得到溢出。

更改临时变量以键入long long int (或者更好的是, uint64_t )应该解决这个问题。

你必须long long使用fnow, fnext, and tempf ,试试:

 long long int fnow = 0, fnext = 1, tempf; 

使变量长而不是int。 ‘int’取决于机器可以是64,32,16或8位。

如果你想自己指定整数的大小并制作一个可移植的代码,那么可以使用uint8_t,uint16_t等,或int8_t,int16_t等.’u’代表无符号。 这是stdint.h库的一部分!