La espada se refiere a la oferta 16. El poder entero del valor
Descripción del Título
Ideas para resolver problemas
La dificultad de esta pregunta es considerar varias condiciones de frontera.
Tenga en cuenta, ¿por qué el exponente de potencias rápidas usa el tipo largo?
Debido a que el rango de int es [-2 ^ 31,2 ^ 31-1], el rango de números negativos es mayor que el de números positivos, por lo que no puede simplemente tomar el valor absoluto. Si la base es exactamente -2 ^ 31 y el exponente es de tipo int, se desbordará.
Para comparar si las variables de tipo doble son iguales, nunca use "==". Utilice el método igual para convertir a una cadena o reduzca la diferencia entre dos variables dobles en un error (como 1e-6) como aquí.
class Solution {
public double myPow(double x, int n) {
long N = n;
//底数为0,指数小于0,则非法
if (isEqual(x, 0.0) && N < 0) return 0.0;
//底数为0,指数大于等于0,直接返回0.0
if (isEqual(x, 0.0) && N >= 0) return 0.0;
return N >= 0 ? quickPow(x, N) : 1.0 / quickPow(x, -N);
}
//快速幂模板, 注意指数 exponent 是 long 类型防止溢出,且为非负数
public double quickPow(double base, long exponent) {
if (exponent == 0) return 1;
if (exponent == 1) return base;
double res = quickPow(base, exponent >> 1);
res *= res;
//如果是奇数,则要额外乘上base
if ((exponent & 0x01) == 1)
res *= base;
return res;
}
//判断两个 double 变量是否相等
public boolean isEqual(double a, double b) {
return Math.abs(a - b) < 1e-6;
}
}