快速幂
作者:互联网
分为递归快速幂和非递归快速幂两种。
它可以以的时间复杂度计算乘方。
递归快速幂
程序
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