为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中将int转换为bigint?

如何在golang中将int转换为bigint?

Go
交互式爱情 2021-11-22 15:37:10
我试图描述来实现快速的双斐波那契算法在这里:// Fast doubling Fibonacci algorithmpackage mainimport "fmt"//  (Public) Returns F(n).func fibonacci(n int) int {    if n < 0 {        panic("Negative arguments not implemented")    }    fst, _ := fib(n)    return fst}// (Private) Returns the tuple (F(n), F(n+1)).func fib(n int) (int, int) {    if n == 0 {        return 0, 1    }    a, b := fib(n / 2)    c := a * (b*2 - a)    d := a*a + b*b    if n%2 == 0 {        return c, d    } else {        return d, c + d    }}func main() {    fmt.Println(fibonacci(13))    fmt.Println(fibonacci(14))}这适用于小数字;但是,当输入的数字变大时,程序会返回错误的结果。所以我尝试使用bigIntfrommath/big包:// Fast doubling Fibonacci algorithmpackage mainimport (    "fmt"    "math/big")//  (Public) Returns F(n).func fibonacci(n int) big.Int {    if n < 0 {        panic("Negative arguments not implemented")    }    fst, _ := fib(n)    return fst}// (Private) Returns the tuple (F(n), F(n+1)).func fib(n int) (big.Int, big.Int) {    if n == 0 {        return big.Int(0), big.Int(1)    }    a, b := fib(n / 2)    c := a * (b*2 - a)    d := a*a + b*b    if n%2 == 0 {        return c, d    } else {        return d, c + d    }}func main() {    fmt.Println(fibonacci(123))    fmt.Println(fibonacci(124))}但是, go build 抱怨说cannot convert 0 (type int) to type big.Int如何缓解这个问题?
查看完整描述

1 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

使用big.NewInt()代替big.Int()。big.Int()只是类型转换。您需要查看包的文档big

您应该主要使用带有形式的方法func (z *T) Binary(x, y *T) *T    // z = x op y

要在调用Mul方法之后将需要提供结果变量的 2 个参数相乘。因此,例如,要获得 2*2 的结果,您需要:

big.NewInt(0).Mul(big.NewInt(2), big.NewInt(2))


您可以尝试在 Go playground


您还可以创建扩展功能,例如:


func Mul(x, y *big.Int) *big.Int {

    return big.NewInt(0).Mul(x, y)

}

为了使代码更具可读性:


// Fast doubling Fibonacci algorithm

package main


import (

    "fmt"

    "math/big"

)


//  (Public) Returns F(n).

func fibonacci(n int) *big.Int {

    if n < 0 {

        panic("Negative arguments not implemented")

    }

    fst, _ := fib(n)

    return fst

}


// (Private) Returns the tuple (F(n), F(n+1)).

func fib(n int) (*big.Int, *big.Int) {

    if n == 0 {

        return big.NewInt(0), big.NewInt(1)

    }

    a, b := fib(n / 2)

    c := Mul(a, Sub(Mul(b, big.NewInt(2)), a))

    d := Add(Mul(a, a), Mul(b, b))

    if n%2 == 0 {

        return c, d

    } else {

        return d, Add(c, d)

    }

}


func main() {

    fmt.Println(fibonacci(123))

    fmt.Println(fibonacci(124))

}


func Mul(x, y *big.Int) *big.Int {

    return big.NewInt(0).Mul(x, y)

}

func Sub(x, y *big.Int) *big.Int {

    return big.NewInt(0).Sub(x, y)

}

func Add(x, y *big.Int) *big.Int {

    return big.NewInt(0).Add(x, y)

}


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信