Implement pow(x, n).
[思路及要点]
很多提及的是二分法,但是这样会出现奇数次和偶数次两种情况需要处理。
我这里介绍的方法是位移法,采用讲n分解为二进制的位。
这里我们使用一个例子:x^7
首先,我们先吧指数变成二进制表示。x^7 = x^(111) 这里的111是二进制。
并且我们也可以这样表示 x^7 = x^(4 + 2 + 1) = x^4 * x ^ 2 * x 。
我们的指数二进制表示有3位,则0号位对应x,1号位对应x^2,2号位对应x^4。
这里我们发现结果其实是根据指数二进制位的存在,来决定是否需要乘以对应位的base。左base = 右base * 右base。
可能这样讲解还是有点难以理解,那么就参考代码吧。
[代码]
class Solution {
public:
double pow(double x, int n) {
if (n == 0) return 1;
if (n == 1) return x;
if (n == -1) return 1 / x;
if (x == 1) return 1;
if (x == -1) {
return (n % 2 ? -1 : 1);
}
if (n < 0) return 1 / pow(x, -n);
double res = 1;
double base = x;
while (n) {
if (n & 1) {
res *= base;
}
base *= base;
n >>= 1;
}
return res;
}
};