我目前有以下代码用于我的斐波纳契计算.我正在尝试计算大数字,但是一旦达到100,就会出现计算结果.对于fib(100),我的代码返回3736710778780434371,但是当我查看其他来源时,它告诉我正确的计算应该是354224848179261915075.我的代码中是否有问题或者它与我的计算机硬件或其他什么有关?
package main
import "fmt"
func fib(N uint) uint{
var table []uint
table = make([]uint, N+1)
table[0] = 0
table[1] = 1
for i := uint(2); i <= N; i += 1 {
table[i] = table[i-1] + table[i-2]
}
return table[N]
}
func main() {
fmt.Println(fib(100))
}
Run Code Online (Sandbox Code Playgroud)
你正在整数溢出!您只能使用uint最大为a的大小进行计算uint; 一旦你超越它的界限,它将(静静地)再次回绕.
在你的情况下,它看起来好像uint是64位长.(它的大小取决于您运行的平台.)这意味着您将能够存储最大值为2 64 -1的值.如果再添加一个,它将回绕到0,并且不会返回错误.
如果你将你得到的答案和正确答案转换为十六进制,那么你会看到情况就是如此.你结束了
33DB76A7C594BFC3
Run Code Online (Sandbox Code Playgroud)
而正确答案是
1333DB76A7C594BFC3
Run Code Online (Sandbox Code Playgroud)
请注意,你的答案是正确的...它只是不够远.你只得到答案的低64位; 你错过了其他13*2 64.
要更正它,您需要使用Package big中的任意大小整数,而不是a uint.