其他分享
首页 > 其他分享> > 快速幂

快速幂

作者:互联网

分为递归快速幂和非递归快速幂两种。

它可以以[公式]的时间复杂度计算乘方

递归快速幂

 

 

 程序

int qpow(int a, int n)
{
    if (n == 0)
        return 1;
    else if (n % 2 == 1)
        return qpow(a, n - 1) * a;
    else
    {
        int temp = qpow(a, n / 2);
        return temp * temp;
    }
}

这个temp变量是必要的,因为如果不把

[公式]

记录下来,直接写成qpow(a, n /2)*qpow(a, n /2),那会计算两次

[公式]

,整个算法就退化为了 

[公式]

题目常常会要求对一个大素数取模,这是因为计算结果可能会非常巨大,但是在这里考察高精度又没有必要。这时我们的快速幂也应当进行取模,此时应当注意,原则是步步取模,如果MOD较大,还应当开long long。程序如下
typedef long long ll;
ll qpow(ll a, ll n)
{
    if (n == 0)
        return 1;
    else if (n % 2 == 1)
        return qpow(a, n - 1) * a % MOD;
    else
    {
        ll temp = qpow(a, n / 2) % MOD;
        return temp * temp % MOD;
    }
}

非递归快速幂
如果我们要计算7的10次幂,可根据10的二进制表示1010,拆分为71000和70010相乘
int qqow(int a,int b){
int ans=1;
while(b&1){
ans=ans*a;
a*=a;
b>>=1;
}
return ans;}

标签:qpow,return,temp,int,ll,ans,快速
来源: https://www.cnblogs.com/liusmall/p/15644071.html