代码之家  ›  专栏  ›  技术社区  ›  s_z_p

斐波那契中的负数

  •  0
  • s_z_p  · 技术社区  · 7 年前

    如果我检查代码中的数字 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 回复  |  直到 7 年前
        1
  •  2
  •   Szabolcs    7 年前

    尝试修改您的 fibo 函数来自 int uint64 并声明 a b uint64 ,与 整数 输出会溢出,这就是为什么会得到负值:

    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的元素,这仍然远远不是完美的解决方案,将发生溢出。

    更新:适用于任意大数。

    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 我用同样的逻辑得到同样的结果。

    希望有帮助!