转载自百度百科:
快速幂
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
<cmath>库中pow函数的时间复杂度就是O(N);
原理
把b转换成
二进制数。
该二进制数第i位的权为

例如

11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算

常规求幂
1
2
3
4
5
6
7
|
int
pow1(inta,intb)
{
int
r=1;
while
(b--)
r*=a;
return
r;
}
|
二分求幂(一般)
1
2
3
4
5
6
7
8
9
10
11
12
|
int
pow2(inta,intb)
{
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
|
intpow3(inta,intb)
{
intr=1,base=a;
while
(b!=0)
{
if
(b&1)
r*=base;
base*=base;
b>>=1;
}
return
r;
}
|
快速求幂(位运算,同pow3函数,但更复杂)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
intpow4(intx,intn)
{
if
(n==0)return1;
else
{
while
((n&1)==0)
{
n>>=1;
x*=x;
}
}
intresult=x;
n>>=1;
while
(n!=0)
{
x*=x;
if
((n&1)!=0)
result*=x;
n>>=1;
}
return
result;
}
|