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

时间:2015-11-12 03:37:50

标签: go

我尝试按照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))
}

这适用于小数字;但是,当输入数字变大时,程序返回错误的结果。所以我尝试使用bigInt包中的math/big

// 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.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 个答案:

答案 0 :(得分:6)

使用 import android.graphics.Typeface; ... Typeface greek = Typeface.createFromAsset(getAssets(), "fonts/aisauc.ttf"); mytextfield.setTypeface(greek); 代替big.NewInt()big.Int()只是类型转换。 您需要查看documentation of big package
您应该主要使用表单big.Int()的方法 在调用func (z *T) Binary(x, y *T) *T // z = x op y方法之后,要将2个参数相乘,您需要提供结果变量。因此,例如,要获得2 * 2的结果,您需要:
Mul

您可以尝试 Go playground

上的示例

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

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

使代码更具可读性:

func Mul(x, y *big.Int) *big.Int {
    return big.NewInt(0).Mul(x, y)
}

Go playground

上试试