当进行高精度运算的时候unint64已经无法满足需求,这个时候大家可以采用math.big库来进行高精度计算,下面以计算第1000 000位的费布拉切数来展示big的用法,代码如下:
package main
import (
"fmt"
"math/big"
"time"
)
const LIM = 1000000 //求第1000000位的费布拉切数
var fibs [LIM]*big.Int//使用数组保存计算出来的费布拉切数的指针
func main() {
result := big.NewInt(0)
start := time.Now()
for i := 0; i < LIM; i++ {
result = fibonacci(i)
fmt.Printf("fibonacci(%d) is: %d\n", i, result)
}
fmt.Println(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
}
计算出来的结果如下:
计算结果正确,但是使用这个方法计算费布拉切不仅耗时而且占用太多的内存,可以定义两个变量去保存最近的前两个结果,这个就不用占用太多的内存,这样的话求第1000000的费布拉切数的耗时可以降到2-6s之间,如果还想将耗时降低的话,可以使用矩阵和快递幂运算,这样就可以将耗时降到us级别,具体的可以看我的下一遍的文章!