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

分析: 由于指数是int 类型,所以要区分整数还是负数或者0.

  1. 直接方法:直接连续累乘。

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. 快速幂运算。

分析:直接累乘的方法固然很简单,但是往往会造成多次相乘运算,这样反而不好。那么怎么才能减少乘法的次数,还能达到

           正确的计算结果呢。这就是要利用一个技巧,就是 v^{2a} = v^{a} * v^{a},也就是说对于一个很大的偶数指数,我们不需要乘以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的指数次方的值,以便于后面总体计算应用。

也就是

 base^{11} = base^{8} * base^{2} * base^{1} = base^{2^{3}} * base^{2^{1}} * base^{2^{0}} = (1 * base^{2^{3}}) * (0 * base^{2^{2}}) * (1 * base^{2^{1}}) * (1* base^{2^{0}})

仔细观看上面公式发现:

我们可以通过在循环里通过自乘运算依次实现base^{2^{0}},base^{2^{1}},base^{2^{2}},base^{2^{3}},而这些指数前面的系数刚好就是题目中指数对应的每一位二进制数。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;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值