顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
原理
以下以求 a^b 来介绍:
把 b 转换成二进制数,该二进制数第 i 位的权为
例如:
11 的二进制是 1011,故
因此,我们将 a^11 转化为算
实现
常规求幂:
int pow(int a, int b){
int r = 1;
while(b--){
r *= a;
}
return r;
}
一般求幂:
int pow(int a, int b){
int r = 1, base = a;
while(b != 0){
if(b%2) r *= base;
base *= base;
b /= 2;
}
return r;
}
递归求幂:
int pow(int a, int b){
if(b == 1) return a;
int temp = pow(a, b/2);
return (b%2==0? 1 : a) * temp * temp;
}
位运算:
int pow(int x, int y){
if(y == 0) return 1;
else{
while((y&1) == 0){
y >>= 1;
x *= x;
}
}
int result = x;
y >>= 1;
while(y != 0){
x *= x;
if(y & 1) result *= x;
y >>= 1;
}
return result;
}
long long quickpower(long long x, long long y){
long long ans=1, cnt=x;
while(y){
if(y & 1) ans *= cnt;
cnt *= cnt;
y >>= 1;
}
return ans;
}
语法👇
b&1 :取 b 二进制的最低位,判断和 1 是否相同,相同返回 1,否则返回 0,可用于判断奇偶。
b>>1:把 b 的二进制右移一位,即去掉其二进制位的最低位。