对于普通类型的求a^n,我们的求法是不是a*a*a*a....,这样乘以n次,时间复杂度为O(n),对于普通n比较小的我们可以接受,然而当n比较大的时候,计算就慢了,所以我们就去寻找更快捷的计算方法!例如:我们要求2^8,我们通过当为偶数的时候,a^n=(a*a)^(n/2),当n为奇数时,a^n=a*(a*a)^(n/2)的形式,是不是可以转化为4^4->8^2->64^1,就可以了,2^5的话2*4^2->2*16^1。下面直接给出代码吧。int power(int a, int n)
{
int ans = 1;
while(n > 0) {
if(n&1) //当n为奇数时,乘以余下的一个a
ans *= a;
a *= a;
n /= 2;
}
return ans;
}
但是当n比较大时往往我们的结果都非常大,如果直接算的话就会溢出,所以我们在计算的过程中会对结果取模,然后我们就有了快速幂取模算法。控制数据的大小,对于取模我们有(a*b)%c = ((a%c)*(b%c))%c,给出代码。
int power(long long a, int n)
{
long long ans = 1;
while(n > 0) {
if(n&1) {
ans *= a;
ans %= mod;
}
a *= a%mod;
a %= mod;
n /= 2;
}
return ans%mod;
}