Golang Fibonacci计算出现了

时间:2014-11-08 21:32:22

标签: 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))
}

2 个答案:

答案 0 :(得分:8)

你正在整数溢出!您只能使用uint进行计算,最大为uint;一旦你超越它的界限,它将(静静地)再次回绕。

在您的情况下,看起来uint长度为64位。 (它的大小取决于您运行的平台。)这意味着您将能够存储最多2 64 -1的值。如果再添加一个,它将回绕到0,并且不会返回错误。

如果你将你得到的答案和正确的答案转换成十六进制,那么你会看到情况就是这样。你最终得到了

  33DB76A7C594BFC3

而正确答案是

1333DB76A7C594BFC3

请注意,你的答案是正确的......它只是不够远。你只得到答案的低64位;你错过了其他13 * 2 64

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

答案 1 :(得分:3)

以下是使用big.Int生成正确答案(playground

的版本
package main

import (
    "fmt"
    "math/big"
)

func fib(N uint) *big.Int {
    var table []*big.Int
    table = make([]*big.Int, N+1)
    table[0] = new(big.Int).SetInt64(0)
    table[1] = new(big.Int).SetInt64(1)

    for i := uint(2); i <= N; i += 1 {
        table[i] = new(big.Int).Add(table[i-1], table[i-2])
    }

    return table[N]
}

func main() {
    fmt.Println(fib(100))
}

哪个产生

354224848179261915075