快速幂

求一个数的幂次数,简单方法就是循环乘法,复杂度是O(n)。

使用快速幂可以做到O(logn)的复杂度。

考虑5^11,将11转为二进制1011,可知11=2^3+2^1+2^0;

那么,511 = 5(2^3+2^1+2^0) = 5(2^3)*5(2^1)*5(2^0);

只要求得二进制x位为1的5^(2^x)即可;

而5(2^x) = 5(2^(x-1+1)) = 5(2^(x-1)*2)= 5(2^(x-1)+2^(x-1)) = 5(2^(x-1))* 5(2^(x-1))

由此可知,设5(2^(x-1))为A(x-1),那么A(x) = A(x-1) * A(x-1);

循环除以二求解:

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

class Solution {
public:
    double Power(double base, int exponent) {
        int e = abs(exponent);
        double ans = 1;
        while(e) {
            if(e & 1) {
                ans *= base;
            }
            base *= base;
            e>>=1;
        }
        return exponent>=0?ans:1/ans;
    }
};
原文地址:https://www.cnblogs.com/ACMessi/p/9380248.html