斐波纳契的负数

时间:2017-11-03 11:16:29

标签: go fibonacci

如果我在输出中检查我的代码中的数字 6 ,那么 8 是正确的。如果我 99 ,那么我有负数。这段代码出了什么问题:

package main

import (
"fmt"
)

var num = 94

func main() {
  fmt.Printf("%d\n", fibo(num))
}

func fibo(num int) int{
  a, b := 0, 1
  for i := 0; i < num; i++ {
    a, b = b, a + b
  }
  return a
}

1 个答案:

答案 0 :(得分:2)

尝试将fibo函数的返回类型从int修改为uint64,并将ab声明为uint64,如果输出int,它就会溢出,这就是为什么你得到一个负值的结果:

func fibo(num int) uint64{
  var a, b uint64 = 0, 1
  for i := 0; i < num; i++ {
    a, b = b, a + b
  }
  return a
}

然而,它仍然远不是完美的解决方案,因为指数高于93溢出的元素将会发生。

更新:适用于任意大数字。

因此,使用Go的big包,您可以获得有效的fibo功能(至少看起来像这样)。

试试这个:

package main


import (
"fmt"
"math/big"
)


var num int = 94

func main() {
  fmt.Printf("%d\n", fibo(num))
}

func fibo(num int) *big.Int{
  var a, b, t *big.Int = big.NewInt(0), big.NewInt(1), big.NewInt(0)

  for i := 0; i < num; i++ {
    t.Set(a)

    a.Set(b)
    b.Add(b, t)

  }
  return a
}

对于fibo(94),它将输出:

19740274219868223167

Python中看似合法,我用相同的逻辑得到相同的结果。

希望它有所帮助!