快速幂

快速幂

顾名思义,快速幂就是快速计算底数的n次幂的算法。
平常我们计算x的n次幂,n个x相乘,需要进行n-1次运算

int mypow(int x, int n)
{
    if(n == 0) return 1;
    int ans = x;
    for(int i = 2; i <= n; i++)
    {
        ans *= x;
    }
    return ans;
}

复杂度为O(n)

而快速幂的复杂度可以降到O(logn)
logn复杂度就要扯上二进制了
假如n = 25
我们将25化为二进制:11001
按照由二进制转换为十进制的方法计算这个二进制数字
16 * 1 + 8 * 1 + 4 * 0 + 2 * 0 + 1 * 1 = 25

$2^4$ * 1 + $2^3$ * 1 + $2^2$ * 0 + $2^1$ * 0 + $2^0$ * 1 = 25
于是我们计算$x^{25}$
$x^{25}$ = $x^{16}$ * $x^8$ * $x^1$
  = $x{24}$ * $x{23}$ * $x{20}$
于是我们可以利用位运算,每次将n右移一位,最多经过$log_2n$次运算即可求出$xn$

int quickpow(int x,int n)
{
    int res = x;
    int ans = 1;
    while(n)
    {
        if(n & 1)
        {
            ans *= res;
        }
        res *= res;
        n >>= 1;
    }
    return ans;
}
posted @ 2021-09-06 07:30  cheng_zhi  阅读(76)  评论(0)    收藏  举报