将指数用以2为底的幂代表,如14=8+4+2=1110,则x^14 = x^(8 + 4 + 2) = x ^ 8 * x ^ 4 * x ^ 2,使每一轮迭代的底数翻倍,检查指数在当前迭代的指示值是否为1,为1的话说明结果有当前这个底数的因子,由于指数的位数就是log(N)。所以时间的复杂度就是O(log(N))。这里也要注意精度溢出的问题。
class Solution {
public:
double myPow(double x, int n) {
x = n < 0 ? 1 / x : x;
long ln = labs(long(n));
double result = 1;
while (ln) {
result *= ln & 1 ? x : 1;
x *= x;
ln >>= 1;
}
return result;
}
};
递归版本更容易理解:
double pow(double x, int n) {
if (n==0) return 1;
double t = pow(x,n/2);
if (n%2) {
return n<0 ? 1/x*t*t : x*t*t;
} else {
return t*t;
}
}