剑指offer 16. 数值的整数次方
题目描述
解题思路
此题的难点在于考虑各种边界情况。
注意,为什么快速幂的指数用 long 类型?
因为int范围是[-2^31,2^31-1],负数的表示范围比正数大,所以不能简单取绝对值。如果底数正好是-2^31,而指数是 int 类型,则会溢出。
比较double 类型的变量是否相等,千万不能用“==”,要么转成字符串用 equals 方法,要么像这里一样两个double变量相减小于一个误差(如1e-6)。
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;
}
}