转载于 百度百科 https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E5%B9%82/5500243?fr=aladdin
快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
快速幂可以用
位运算来实现
1
|
b
and
1
{也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
|
1
|
b
shr
1
{就是去掉b的二进制最低位(即第0位)}
|
C++实现为
1
|
b & 1
//取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
|
1
|
b>>1
//把b的二进制右移一位,即去掉其二进制位的最低位
|
常规求幂
1
2
3
4
5
|
int
pow1(
int
a,
int
b){
int
r=1;
while
(b--) r*=a;
return
r;
}
|
快速求幂(一般)
1
2
3
4
5
6
7
8
9
|
int
pow2(
int
a,
int
b){
int
r=1,base=a;
while
(b!=0){
if
(b%2) r*=base;
base*=base;
b/=2;
}
return
r;
}
|
快速求幂(位运算)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int
pow3(
int
x,
int
n){
if
(n==0)
return
1;
else
{
while
((n&1)==0){
n>>=1;
x*=x;
}
}
int
result=x;
n>>=1;
while
(n!=0){
x*=x;
if
(n&1) result*=x;
n>>=1;
}
return
result;
}
|
快速求幂(位运算,更简洁)
1
2
3
4
5
6
7
8
9
|
int
pow4(
int
a,
int
b){
int
r=1,base=a;
while
(b){
if
(b&1) r*=base;
base*=base;
b>>=1;
}
return
r;
}
|