una saca raiz potencias potencia poner para numero metodo iterativa for elevar con como calcular java math

java - saca - Cálculo de potencias de enteros



potencia iterativa java (12)

A diferencia de Python (donde los poderes se pueden calcular con ** **), JAVA no tiene esa forma de acceso directo para lograr el resultado de la potencia de dos números. Java tiene una función llamada pow en la clase Math, que devuelve un valor doble

double pow(double base, double exponent)

Pero también puedes calcular las potencias de un entero usando la misma función. En el siguiente programa hice lo mismo y finalmente estoy convirtiendo el resultado en un entero (encasillado). Sigue el ejemplo:

import java.util.*; import java.lang.*; // CONTAINS THE Math library public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n= sc.nextInt(); // Accept integer n int m = sc.nextInt(); // Accept integer m int ans = (int) Math.pow(n,m); // Calculates n ^ m System.out.println(ans); // prints answers } }

Alternativamente, The java.math.BigInteger.pow(int exponent) devuelve un BigInteger cuyo valor es (este ^ exponente). El exponente es un número entero en lugar de un BigInteger. Ejemplo:

import java.math.*; public class BigIntegerDemo { public static void main(String[] args) { BigInteger bi1, bi2; // create 2 BigInteger objects int exponent = 2; // create and assign value to exponent // assign value to bi1 bi1 = new BigInteger("6"); // perform pow operation on bi1 using exponent bi2 = bi1.pow(exponent); String str = "Result is " + bi1 + "^" +exponent+ " = " +bi2; // print bi2 value System.out.println( str ); } }

¿Hay alguna otra forma en Java para calcular la potencia de un entero?

Utilizo Math.pow(a, b) ahora, pero devuelve un doble, y eso es generalmente mucho trabajo, y parece menos limpio cuando solo quieres usar enteros (una potencia también dará como resultado un entero) .

¿Hay algo tan simple como a**b como en Python?


Bueno, puedes simplemente usar Math.pow(a,b) como lo has usado anteriormente y simplemente convertir su valor usando (int) antes. A continuación podría usarse como ejemplo.

int x = (int) Math.pow(a,b);

donde a y b podrían ser valores double o int según lo que desee. Esto simplemente convertirá su salida en un valor entero según lo requiera.


Cuando es poder de 2. Tenga en cuenta que puede usar un ejemplo simple y rápido de 1 << exponente.

2 2 = (int) Math.pow(2, 2) == 1 << 2
2 10 = (int) Math.pow(2, 10) == 1 << 10

Para exponentes más grandes (más de 31) use long

2 32 = (long) Math.pow(2, 32) == 1L << 32

por cierto. en Kotlin tienes shl lugar de << entonces

1L << 32 == 1L shl 32


El mejor algoritmo se basa en la definición de potencia recursiva de a ^ b.

long pow (long a, int b) { if ( b == 0) return 1; if ( b == 1) return a; if (isEven( b )) return pow ( a * a, b/2); //even a=(a^2)^b/2 else return a * pow ( a * a, b/2); //odd a=a*(a^2)^b/2 }

El tiempo de ejecución de la operación es O (logb). Referencia: Más información


Google Guava tiene utilidades matemáticas para enteros. IntMath


Las bibliotecas matemáticas de Guava ofrecen dos métodos que son útiles al calcular las potencias enteras exactas:

pow(int b, int k) calcula b a k la potencia y se ajusta al desbordamiento

checkedPow(int b, int k) es idéntico, excepto que arroja ArithmeticException en overflow

Personalmente checkedPow() satisface la mayoría de mis necesidades para la exponenciación de enteros y es más limpio y seguro que usar las versiones dobles y el redondeo, etc. En casi todos los lugares que quiero una función de potencia, el desbordamiento es un error (o imposible, pero quiero ser informado si lo imposible llega a ser posible).

Si desea obtener un resultado long , puede usar los métodos LongMath correspondientes y pasar los argumentos int .


Los enteros son solo 32 bits. Esto significa que su valor máximo es 2^31 -1 . Como puede ver, para números muy pequeños, obtiene rápidamente un resultado que ya no puede ser representado por un número entero. Es por eso que Math.pow usa el doble.

Si quieres una precisión entera arbitraria, usa BigInteger.pow . Pero, por supuesto, es menos eficiente.


Me las arreglé para modificar (límites, incluso control, verificación negativa de nums) Qx__ respuesta. Úselo bajo su propio riesgo. 0 ^ -1, 0 ^ -2 etc. ... devuelve 0.

private static int pow(int x, int n) { if (n == 0) return 1; if (n == 1) return x; if (n < 0) { // always 1^xx = 1 && 2^-1 (=0.5 --> ~ 1 ) if (x == 1 || (x == 2 && n == -1)) return 1; else return 0; } if ((n & 1) == 0) { //is even long num = pow(x * x, n / 2); if (num > Integer.MAX_VALUE) //check bounds return Integer.MAX_VALUE; return (int) num; } else { long num = x * pow(x * x, n / 2); if (num > Integer.MAX_VALUE) //check bounds return Integer.MAX_VALUE; return (int) num; } }


No, no hay algo tan corto como a**b

Aquí hay un bucle simple, si quieres evitar dobles:

long result = 1; for (int i = 1; i <= b; i++) { result *= a; }

Si desea utilizar pow y convertir el resultado en entero, envíe el resultado de la siguiente manera:

int result = (int)Math.pow(a, b);


Una implementación simple (sin comprobaciones de desbordamiento o de validez de argumentos) para el algoritmo de cuadratura repetida para calcular la potencia:

/** Compute a**p, assume result fits in a 32-bit signed integer */ int pow(int a, int p) { int res = 1; int i1 = 31 - Integer.numberOfLeadingZeros(p); // highest bit index for (int i = i1; i >= 0; --i) { res *= res; if ((p & (1<<i)) > 0) res *= a; } return res; }

La complejidad del tiempo es logarítmica al exponente p (es decir, es lineal al número de bits requerido para representar p).


Use la lógica a continuación para calcular la n potencia de a.

Normalmente si queremos calcular n potencia de a. Multiplicaremos ''a'' por n número de veces. La complejidad del tiempo de este enfoque será O (n) Dividir la potencia n por 2, calcular Exponentattion = multiplicar ''a'' hasta n / 2 solamente. Duplicar el valor Ahora la Complejidad del Tiempo se reduce a O (n / 2).

public int calculatePower1(int a, int b) { if (b == 0) { return 1; } int val = (b % 2 == 0) ? (b / 2) : (b - 1) / 2; int temp = 1; for (int i = 1; i <= val; i++) { temp *= a; } if (b % 2 == 0) { return temp * temp; } else { return a * temp * temp; } }


import java.util.*; public class Power { public static void main(String args[]) { Scanner sc=new Scanner(System.in); int num = 0; int pow = 0; int power = 0; System.out.print("Enter number: "); num = sc.nextInt(); System.out.print("Enter power: "); pow = sc.nextInt(); System.out.print(power(num,pow)); } public static int power(int a, int b) { int power = 1; for(int c=0;c<b;c++) power*=a; return power; } }