【问题】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

【思路】首先我们来说一个O(n)的方法,这个题目主要考虑到幂指数为负的情况需要对结果求倒数。

1class Solution {
 2public:
 3    double Power(double base, int exponent) {
 4        double res = 1;
 5        if(exponent == 0)
 6            return 1;
 7        if(base == 0)
 8            return 0;
 9        for(int i = 0;i < abs(exponent); ++i){
10            res *= base;
11        }
12        if(exponent < 0){
13            res = 1 / res;
14        }
15        return res;
16    }
17};

显然,上面的算法一定不会合面试官的胃口的,因此我们可以使用一个快幂算法来进行求解!其实际编程不复杂,但是效率很高的!

假设3^64需要64个乘法运算,但如果这样计算的话:

3^1 = 3 (也就是base)
3^2 = (3^1) * (3^1)
3^4 = (3^2) * (3^2)

3^64 = (3^32) * (3*32)

这个样子的话,就只算6次乘法,效率提升了很多了!因此我们就可以进行如下编程。

 1class Solution {
 2public:
 3    double Power(double base, int exponent) {
 4        if(exponent == 0){
 5            return 1;
 6        }
 7        if(base == 0){
 8            return 0;
 9        }
10        double tmp = base;
11        double res = 1;
12        int e = abs(exponent);
13        while(e > 0){
14            if(e & 1){   //e & 1相当于e % 2 
15                res *= tmp;
16            }
17            e >>= 1;   // e >> 1相当于e / 2
18            tmp *= tmp;
19        }
20        return (exponent > 0) ? res : 1 / res;
21    }
22};