快速幂
快速幂
1. 主要思路
就是将运算次数减少,比如4次方的话不用乘4次,乘2次就可以了, 乘方,然后再乘方。
int fastPow(int a,int n){
if(n==1) return a;
int temp = fastPow(a,n/2);
// n是奇数
if (n%2 == 1)
return temp*temp*a;
// n是偶数
else
return temp*temp;
}
奇数的情况,偶数的情况。
2. 写成迭代
int fastPow(int a,int n){
long long base = a;
long long res = 1 ;
while (n){
if (n&1)
res *= base ;
base *= base;
n>>=1;
}
return res;
}
这里很精巧的结合位运算,比如乘11=8+2+1 ,需要跳过乘4 的情况。用位运算& 就行了。
3. 取模
一般幂运算的结果都非常大,通常需要取模操作,缩小结果。
int fastPow(int a,int n,int mod){
long long base = a;
long long res = 1 % mod ;
while (n){
if (n&1)
res = (res* base )% mod;
base = (base* base)%mod;
n>>=1;
}
return res;
}