algorithm - Golang 斐波那契计算出现关闭

标签 algorithm math go

我目前有以下用于斐波那契计算的代码。我正在尝试计算大数,但一旦达到 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))
}

最佳答案

您遇到了整数溢出!您只能使用大小不超过 uintuint 进行计算;一旦你超出了它的界限,它就会(默默地)再次回绕。

在您的例子中,uint 看起来好像是 64 位长。 (它的大小取决于您运行的平台。)这意味着您将能够存储最多 264-1 的值。如果您再添加一个,它会回到 0,并且不会返回错误。

如果您将得到的答案和正确答案转换为十六进制,那么您会发现情况确实如此。你结束了

  33DB76A7C594BFC3

正确答案是

1333DB76A7C594BFC3

请注意,就目前而言,您的答案是正确的……只是还不够深入。您只得到了答案的低 64 位;你错过了其他 13*264

要更正它,您需要使用 Package big 中的任意大小的整数,而不是 uint

关于algorithm - Golang 斐波那契计算出现关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26822328/

相关文章:

go - uber-go/zap logger 如何记录到 Kafka 主题?

session - 从多种错误类型中检测特定错误

algorithm - 如何在退化树中找到所有从特定顶点开始的均等路径?

php - 如何使用 PHP 获取到午夜的小时数

algorithm - Prim 和 Dijkstra 图算法的区别

c++ - 应用于单个时间序列的独立成分分析

algorithm - 将 48 位 key 散列为 16 位值

实现 Go goroutine 或 Go channel 的 C++ 库?

algorithm - 图表中的连接点和桥梁

algorithm - 动态规划的问题