快速幂

来源:互联网 发布:js 对象排序 编辑:程序博客网 时间:2024/06/07 05:39

参考百度百科

快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

原理
以下通过求a^b来介绍
首先把b转换成二进制数,该二进制数第i位的权为 2^(i-1)
例如:13的二进制表示为1101
因此,我们将a^13转化为算a^(2^3)*a^(2^2)*a(2^0)

实现
可以通过位运算来快速实现,通过将b&1来判断b的最小的一位是否为1来做乘法运算

double ans=1.0;double cur=a;while(b){    if(b&1)ans*=cur;    cur*=cur;  //翻倍,因为a^(2^(i+1))与a^(2^i)是倍数关系               //即a^(2^(i+1))=a^(2^i)*a^(2^i)    b>>1;}

详细代码如下:

    double Power(double base, int exponent) {        double ans = 1.0;        double cur = base;        while (exponent){            if (exponent & 1)ans *= cur;            cur *= cur;            exponent >>= 1;        }        return ans;    }
原创粉丝点击