递归快速幂
(对大素数取模)
typedef long long ll;
ll Quick_pow(ll a,int n)
{
if(n == 0)
return 1;//出口为"a^0=1"
else if(n % 2 == 1)
return Quick_pow(a, n-1)*a;
else{
ll temp = Quick_pow(a, n/2);
return temp*temp;
}
}
虽然简洁,但会产生额外的空间开销。我们可以把递归改写为循环,来避免对栈空间的大量占用,即非递归快速幂
非递归快速幂
typedef long long ll;
ll Quick_pow(int a,int n)
{
int ans = 1;
while(n)
{
if(n&1)
ans *= a;
a *= a;
n >>= 1;
}
return ans;
}
这里以7^10为例: