如何在golang中将int转换为bigint?
发布时间:2020-12-16 19:04:45 所属栏目:大数据 来源:网络整理
导读:我正在尝试实现快速双斐波纳契算法,如 here所述: // 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 f
我正在尝试实现快速双斐波纳契算法,如
here所述:
// Fast doubling Fibonacci algorithm package main import "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)) } 这适用于小数字;但是,当输入数字变大时,程序返回错误的结果.所以我尝试使用math / big包中的bigInt: // 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,F(n+1)). func fib(n int) (big.Int,big.Int) { if n == 0 { return big.Int(0),big.Int(1) } a,c + d } } func main() { fmt.Println(fibonacci(123)) fmt.Println(fibonacci(124)) } 然而,go build抱怨说 cannot convert 0 (type int) to type big.Int 如何缓解这个问题?
使用big.NewInt()而不是big.Int(). big.Int()只是类型转换.
你需要查看 documentation of big package
你应该主要使用形式为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,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,Add(c,d) } } func main() { fmt.Println(fibonacci(123)) fmt.Println(fibonacci(124)) } func 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) } 试试Go playground (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |