快速幂算法,模板

对于计算比较大的幂的结果时可以采用快速幂来降低时间复杂度

例如求K的n次幂

int Pow(int K, int n)
{
    for (int i = 0; i < n; i++)
        K *= K;
    return K;
}

最朴素的思想就是直接n次循环,让K自乘n次,但是随着n的增加循环次数会越来越多,时间复杂度会很高

于是我们可以使用快速幂算法来实现幂运算的快速计算

对于快速幂算法有两种理解思路,一种是指数折半一种是将指数化为二进制数

具体可看(24条消息) 快速幂算法 超详细教程_qascetic的博客-CSDN博客

不过经过优化这两种思路的代码都一样

如下

int Quick_Mi2(int K, int n)
{
    int ans = 1;
    while (n)
    {
        if (n & 1)//相当于n&(0001)(2进制),会取出n二进制的最低位数
            ans *= K;//累乘
        K *= K;//每次计算出K的2次方,4次方,8次方.....,可以参考二进制转换十进制的思路
        n >>= 1;
    }
    return ans;
}

当然也可以递归实现

int Quick_Mi1(int K,int n)
{
    if (n == 0)
        return 1;
    if (n % 2 == 0)
    {
        int Temp= Quick_Mi1(K, n / 2);
        return Temp * Temp;
    }
    else
    {
        return Quick_Mi1(K, n - 1) * K;
    }
}
posted @ 2023-04-18 17:54  凪风sama  阅读(18)  评论(0编辑  收藏  举报