本题主要利用了,x^2n = (x^n)*(x^n), x^(2n+1) = (x^n)*(x^n)*x。注意n是负数,对其取反的时候,可能会溢出,所以需要用到long long类型。另外0^0是未定义的,因为0^0 = 0^1 / 0^1 = 0 / 0, 0作为除数是未定义的。但是库函数pow(0.0,0) = 1,所以下面我们这样进行处理:0^a,假如a==0,则结果为1,如果a>0,则结果为0,如果a<0,则结果是未定义的。另外此题非常经典,需要熟练掌握。代码如下:
class Solution {
private:
double helper(double x, long long n) {
if (n == 0) {
return 1.0;
}
double half = helper(x, n/2);
if (n&1) {
return x*half*half;
} else {
return half*half;
}
}
public:
double myPow(double x, int n) {
long long nn = n; // 使用long long主要防止n=-2147483648时,取反溢出
if (n<0) {
nn = -n;
}
if (n<0) {
return 1.0/helper(x, nn);
} else {
return helper(x, nn);
}
}
};