Tôi đã cố gắng tính toán 2^100
trong Golang. Tôi hiểu số limit of numeric type và đã thử sử dụng gói math/big
. Đây là những gì tôi đã thử nhưng tôi không thể tìm ra lý do tại sao nó không hoạt động.Tính toán lũy thừa lớn trong Golang
Tôi đã sử dụng phương pháp computation by powers of two để tính toán lũy thừa.
package main
import (
"fmt"
"math/big"
)
func main() {
two := big.NewInt(2)
hundred := big.NewInt(50)
fmt.Printf("2 ** 100 is %d\n", ExpByPowOfTwo(two, hundred))
}
func ExpByPowOfTwo(base, power *big.Int) *big.Int {
result := big.NewInt(1)
zero := big.NewInt(0)
for power != zero {
if modBy2(power) != zero {
multiply(result, base)
}
power = divideBy2(power)
base = multiply(base, base)
}
return result
}
func modBy2(x *big.Int) *big.Int {
return big.NewInt(0).Mod(x, big.NewInt(2))
}
func divideBy2(x *big.Int) *big.Int {
return big.NewInt(0).Div(x, big.NewInt(2))
}
func multiply(x, y *big.Int) *big.Int {
return big.NewInt(0).Mul(x, y)
}
Đó là sự thật. Nó không có ý nghĩa gì khi lấy hai '* big.Int' làm đối số. Tôi thích cách tiếp cận của bạn. –
@YeLinAung thực sự nếu tại một số thời điểm bạn sẽ cần số nguyên lớn, bạn có thể sửa đổi nó dễ dàng để làm điều này. Tôi đã viết hàm này chỉ để làm ví dụ đồ chơi, để đảm bảo tôi hiểu thuật toán, nhưng nếu cần sử dụng nó ở đâu đó trong mã sản xuất của bạn, thay vì sử dụng phương thức Exp mặc định. –
'new (big.Int) .Exp (big.NewInt (int64 (a)), big.NewInt (int64 (n)), nil)' là nhanh hơn (và có thể được cải thiện để không realloc kết quả, như phần còn lại của các thường trình 'math/big' làm). –