在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库的一部分!