進行高進度運算的時候unint64已經無法滿足需求,這個時候大家可以采用math.big庫來進行高進度計算,下面以計算第10000位的菲波納切數來展示big的用法,代碼如下:
package main import ( "fmt" "math/big" "time" ) const LIM = 10000 //求第10000位的費布拉切數 var fibs [LIM]*big.Int //使用數組保存計算出來的費布拉切數的指針 func main() { result := big.NewInt(0) start := time.Now() for i := 0; i < LIM; i++ { result = fibonacci(i) if i == LIM-1 { fmt.Printf("fibonacci(%d) is: %d\n", i, result) } } fmt.Println(result) fmt.Printf("%T\n", result) end := time.Now() delta := end.Sub(start) fmt.Printf("longCalculation took this amount of time: %s\n", delta) } func fibonacci(n int) (res *big.Int) { if n <= 1 { res = big.NewInt(1) } else { temp := new(big.Int) res = temp.Add(fibs[n-1], fibs[n-2]) } fibs[n] = res return }
計算結果正確,但是使用這個方法計算費布拉切不僅耗時而且占用太多的內存,可以定義兩個變量去保存最近的前兩個結果,這個就不用占用太多的內存,這樣的話求第10000的費布拉切數的耗時可以降很多,如果還想將耗時降低的話,可以使用矩陣和快遞冪運算,這樣就可以將耗時降到us級別!
Go語言的big包實現大整數運算
// bigint project main.go package main import ( "fmt" "math" "math/big" ) func main() { // Here are some calculations with bigInts: im := big.NewInt(math.MaxInt64) in := im io := big.NewInt(1956) ip := big.NewInt(1) ip.Mul(im, in).Add(ip, im).Div(ip, io) fmt.Printf("Big Int: %v\n", ip) iq := big.NewInt(10000) ip.Mod(ip, iq) fmt.Printf("Big Int: %v\n", ip) }
程序說明:
1.math包中包含有各種功能函數,包括最大的整數math.MaxInt64
2.math/big包可以用於大整數計算
3.大整數可以使用"%v"格式輸出
另外,顯式初始化一個大數只能到上限math.MaxInt64,如果想設置比這還大的數,則只能使用如下方法,即從byte到big int:
Convert byte array to big.Int
import "math/big" z := new(big.Int) z.SetBytes(byteSliceHere)
or:
func Base64ToInt(s string) (*big.Int, error) { data, err := base64.StdEncoding.DecodeString(s) if err != nil { return nil, err } i := new(big.Int) i.SetBytes(data) return i, nil }
Convert String to big.Int
使用 math/big 的內置函數:
func (z *Int) SetString(s string, base int) (*Int, bool)
示例:
package main import ( "fmt" "math/big" ) func main() { n := new(big.Int) n, ok := n.SetString("314159265358979323846264338327950288419716939937510582097494459", 10) if !ok { fmt.Println("SetString: error") return } fmt.Println(n) }
Convert a bigint to a string in Go :
bigint := big.NewInt(123) bigstr := bigint.String()