Ich habe versucht, 2^100
in Golang zu berechnen. Ich verstehe die limit of numeric type und versuchte mit math/big
Paket. Hier ist, was ich versucht habe, aber ich kann nicht herausfinden, warum es nicht funktioniert.Berechnung großer Potenzierung in Golang
Ich habe computation by powers of two Methode verwendet, um die Exponentiation zu berechnen.
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)
}
Das stimmt. Es macht nicht viel Sinn, zwei "* big.Int" als Argumente zu nehmen. Ich mag deinen Ansatz. –
@YeLinAung tatsächlich, wenn Sie zu einem Zeitpunkt große Ganzzahlen benötigen, können Sie es leicht ändern, um dies zu tun. Ich habe diese Funktion nur als ein Spielzeugbeispiel geschrieben, um sicherzustellen, dass ich den Algorithmus verstehe, aber wenn Sie ihn irgendwo in Ihrem Produktionscode verwenden müssen, verwenden Sie lieber die Standard-Exp-Methode. –
'new (big.Int) .Exp (big.NewInt (int64 (a)), big.NewInt (int64 (n)), nil)' ist schneller (und könnte verbessert werden, um das Ergebnis nicht erneut zuzuweisen, wie der Rest der 'math/big' Routinen tun). –