我目前有以下用于斐波那契计算的代码。我正在尝试计算大量数字,但是一旦达到 100,就会出现计算中断。对于fib(100),我的代码返回3736710778780434371,但是当我查看其他来源时,它告诉我正确的计算应该是354224848179261915075。我的代码有问题还是与我的计算机硬件或其他什么有关?package mainimport "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))}
2 回答
慕哥6287543
TA贡献1831条经验 获得超10个赞
您遇到了整数溢出!您最多只能使用 auint
的大小进行计算uint
;一旦你超越了它的界限,它就会(默默地)再次绕回原处。
在您的情况下, a 看起来好像uint
是 64 位长。(它的大小取决于您运行的平台。)这意味着您将能够存储高达 2 64 -1 的值。如果再添加一个,它将返回到 0,并且不会返回错误。
如果您将得到的答案和正确答案转换为十六进制,那么您会发现情况确实如此。你结束了
33DB76A7C594BFC3
而正确的答案是
1333DB76A7C594BFC3
请注意,就其而言,您的答案是正确的……只是还远远不够。你只得到了答案的低 64 位;你错过了另一个 13*2 64。
要纠正它,您需要使用Package big 中的任意大小整数,而不是uint
.
- 2 回答
- 0 关注
- 220 浏览
添加回答
举报
0/150
提交
取消