分析: 由于指数是int 类型,所以要区分整数还是负数或者0.
- 直接方法:直接连续累乘。
c++
class Solution {
public:
double Power(double base, int exponent) {
int ab_e = std::abs(exponent);
double res = 1.0;
while(ab_e != 0) {
res *= base;
ab_e--;
}
if (exponent < 0) {
res = 1.0 / res;
}
return res;
}
};
2. 快速幂运算。
分析:直接累乘的方法固然很简单,但是往往会造成多次相乘运算,这样反而不好。那么怎么才能减少乘法的次数,还能达到
正确的计算结果呢。这就是要利用一个技巧,就是 ,也就是说对于一个很大的偶数指数,我们不需要乘以2a次基数,只需要以2的指数形式依次相乘直到2a次方即可。例如 :base = 1.5, exponent = 11,则 我们的计算过程是
b1 b2=b1^2 b3=b2^2 b4=b3^2 b5=b2 b6=b1
1.5 1.5^2 1.5^4 1.5^8 1.5^10 1.5^11
由上面的两行计算,我们只需要计算出b1, b2, b3,b4 即可,而b1就是基数base,所以其实只需要计算b2, b3, b4 即可,
b2=base^2, b3=base^4, b4=base^8。由此,我们看出来,我们需要计算出base的2的指数次方的值,以便于后面总体计算应用。
也就是
仔细观看上面公式发现:
我们可以通过在循环里通过自乘运算依次实现,而这些指数前面的系数刚好就是题目中指数对应的每一位二进制数。exponent = 11 = 1011(二进制)。
所以,我们可以这样实现这个快速幂运算。
step1:首先需要知道在每次循环里通过自乘计算base的2的指数次方。循环的次数就是所求指数exponent的二进制位数
step2: 其次就是对于每个base的2的指数次方,乘以其相对应的二进制位上的数。
step3: 循环里不断的累成step2里计算的结果。
c++
class Solution {
public:
double Power(double base, int exponent) {
int ab_e = std::abs(exponent);
double res = 1.0;
while(ab_e) {
if (ab_e & 1) {
res *= base;
}
base *= base;
ab_e >>= 1;
}
if (exponent < 0){
res = 1.0 / res;
}
return res;
}
};