快速幂

30 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

非递归版本(时间复杂度:logn)

C中的math头文件pow的参数是double类型 该快速幂是long long类型 double的二进制表示不一样 例题 洛谷P1226 原理:位运算 假设计算a^11 11的二进制表示是 1011 (即8+2+1) 则a^11 = a^(8+2+1) = a^8 a^2 a^1

long long fastpow1(long long a,int n)//非递归版本
{
    long long ans = 1;
    while(n)
    {
        if(n&1) //按位与 1&1=1 0&1=0
        {
            ans = ans*a;//这样写取模直接加在后面即可
        }
        a = a*a;//这样写取模直接加在后面即可
        n>>=1; //二进制右移一位
    }
    return ans;
}

递归版本

long long fastpow2(long long a,int n) //递归版本
{
    if(n==1)
    {
        return a;
    }
    long long tmp = fastpow2(a,n/2);
    if(n%2==1) //判断次数是奇数还是偶数
    {
        return tmp*tmp*a; //将a^n分成a^(n/2)*a^(n/2)*a
    }
    else
    {
        return tmp*tmp; //将a^n分成a^(n/2)*a^(n/2)
    }
}