Le calcul des puissances d'entiers
Est-il un autre moyen en Java pour calculer une puissance d'un nombre entier?
- Je utiliser Math.pow(a, b)
maintenant, mais il renvoie une double
, et qui est habituellement beaucoup de travail, et semble moins propre lorsque vous voulez juste utiliser int
s (puissance sera alors également toujours le résultat dans un int
).
Est-il quelque chose d'aussi simple que de a**b
comme en Python?
- C'est un double possible de cette question stackoverflow.com/questions/101439/...
Vous devez vous connecter pour publier un commentaire.
Entiers sont uniquement en 32 bits. Cela signifie que sa valeur max est
2^31 -1
. Comme vous le voyez, pour de très petits nombres, vous disposez rapidement à un résultat qui ne peut pas être représentée par un nombre entier plus. C'est pourquoiMath.pow
utilisedouble
.Si vous voulez entière arbitraire de précision, utilisez
BigInteger.pow
. Mais bien sûr, c'est moins efficace.Java
architectes ont ajoutépow(int, int)
. Vous savez, parfois vous voulez juste que5^6
et ne se soucient pas de double à tous.int
, rien ne vous empêche de les convertir à(int)
une débordé valeur.*
l'opérateur, soit pourint
oulong
entrées puisque pour la plupart des entrées de la multiplication débordement. En fait, même les plus débordements environ la moitié du temps!Meilleur de l'algorithme est basé sur la définition récursive de a^b.
Temps d'exécution de l'opération est O(logb).
Référence:Plus d'informations
isEven(b)
méthode de faire? Est-il de même avecb % 2 == 0
?(isEven(b))' function -- meaning
(b & 1) == 0)` -- et inutilement un algorithme compliqué! (Non, il n'est pas quelque chose d'aussi court que
a**b
Ici est une simple boucle, si vous voulez éviter les doubles:
Si vous souhaitez utiliser
pow
et convertir le résultat en entier, cast le résultat comme suit:O(n)
? Mauvaise nouvelle...long
est de 64 bits, alors O(n) a 64 comme une limite supérieure. Est-ce vraiment si mauvais?b
est2_000_000_000
, alors vous aurez à faire2e9
opérations au lieu de31
dans d'autre solutionQuand c'est la puissance de 2. Tenir à l'esprit, que vous pouvez utiliser, simple et rapide changement d'expression
1 << exponent
exemple:
22 =
1 << 2
=(int) Math.pow(2, 2)
210 =
1 << 10
=(int) Math.pow(2, 10)
Pour les plus grands exposants (plus de 31) utilisation de long au lieu
232 =
1L << 32
=(long) Math.pow(2, 32)
btw. dans Kotlin vous avez
shl
au lieu de<<
donc(java)
1L << 32
=1L shl 32
(kotlin)Google Guava a de maths utilitaires pour les entiers.
IntMath
Bien vous pouvez simplement utiliser
Math.pow(a,b)
comme vous l'avez utilisé plus haut et il suffit de convertir la valeur en utilisant(int)
avant. Ci-dessous pourrait être utilisé comme un exemple pour elle.où
a
etb
pourrait êtredouble
ouint
valeurs que vous voulez.Ce sera tout simplement de convertir sa sortie à une valeur entière comme vous avez exigé.
3.0 ^ 1.0 = 2.999999...
cause des erreurs d'arrondi, la réponse sera2
qui est faux.3.0
.Un peu comme un exemple d'erreur d'arrondi pour la multiplication2.2*3.0 = 6.0000005
plutôt que6.6
.double
peut représenter toutes Javaints
exactement. Voir la Java language specification, la section 5.1.2, "l'Élargissement des Primitives de Conversion".int
, il sera exact. Si elle ne rentre pas dans unint
, puis décimal extension n'est pas votre problème, les débordements sont à votre problème.Goyave, les mathématiques, les bibliothèques offrent deux méthodes sont utiles lors du calcul exact des puissances entières:
pow(int b, int k)
calcule b pour la kième le pouvoir, et s'enroule sur le dépassementcheckedPow(int b, int k)
est identique, sauf qu'il jetteArithmeticException
sur le dépassementPersonnellement
checkedPow()
répond à la plupart de mes besoins pour l'entier exponentiation et est plus propre et safter que d'utiliser les versions doubles et arrondi, etc. Dans presque tous les endroits que je veux une fonction de puissance, le dépassement est une erreur (ou impossible, mais je veux être dit que si l'impossible devient possible).Si vous voulez obtenir un
long
conséquent, vous pouvez simplement utiliser le correspondantLongMath
méthodes et passerint
arguments.J'ai réussi à modifier(limites, même case, négatif nums vérifier) Qx__ réponse. Utilisez à vos propres risques. 0^-1, 0^-2 etc.. retourne 0.
Un simple (pas de vérification de débordement ou de la validité des arguments) de la mise en œuvre de la répétition-la quadrature algorithme pour le calcul de la puissance:
La complexité du temps est logarithmique en exposant de p (c'est à dire linéaire en le nombre de bits nécessaires à la représentation de p).
for
boucle:for (; b > 0; b --)
Contrairement à Python (où des pouvoirs peut être calculé par un**b) , JAVA n'a pas de raccourci pour le résultat de la puissance de deux nombres.
Java a une fonction nommée pow dans la classe de Mathématiques, qui retourne une valeur de type Double
Mais vous pouvez également calculer les puissances d'entiers en utilisant la même fonction. Dans le programme suivant, j'ai fait de même et je suis enfin à convertir le résultat en un entier (typecasting). Suivez l'exemple:
Sinon,
Le
java.math.BigInteger.pow(int exponent)
retourne un BigInteger dont la valeur est (ce^exposant). L'exposant est un entier plutôt qu'un BigInteger. Exemple:Utiliser le dessous logique pour calculer la n de la puissance d'un.
Normalement, si nous voulons calculer n puissance d'un. Nous allons multiplier les " a " par un nombre n de fois.Le temps de la complexité de cette approche sera O(n)
Diviser la puissance de n par 2, calculer Exponentattion = multiplier 'a' jusqu'à n/2 uniquement. Le Double de la valeur. Maintenant, le Temps de la Complexité est réduite à O(n/2).
de base est le nombre que vous voulez pour pouvoir, n est le pouvoir, nous renvoie 1 si n est égal à 0, et l'on retourne à la base si le n est 1, si les conditions ne sont pas remplies, nous utilisons la formule de base*(powerN(de base,n-1)) par exemple: 2 soulevée à l'aide de cette formule est : 2(base)*2(powerN(de base,n-1)).