a
n
a^n
an 正常实现得时间复杂度为O(n)
快速幂得时间复杂度为O(log n)
主要思想就是以二进制的角度看待 n,然后去将每一位的0,1状态做处理就可以1
看一个例子就容易理解了
比如 3 11 3^{11} 311
11的二进制为1011
现在就变成了
3
二
进
制
1011
3^{二进制1011}
3二进制1011
而其中的
1011
=
2
3
+
2
2
∗
0
+
2
1
+
2
0
1011 = 2^3+2^2*0+2^1+2^0
1011=23+22∗0+21+20
之后就成了
3
2
3
+
2
2
∗
0
+
2
1
+
2
0
3^{2^3+2^2*0+2^1+2^0}
323+22∗0+21+20
转化一下
3
2
3
∗
3
2
2
∗
0
∗
3
2
1
∗
3
2
0
3^{2^3}*3^{2^2*0}*3^{2^1}*3^{2^0}
323∗322∗0∗321∗320
代码
int pow(int a, int b){
int res = 1;
// 循环次数为log b 次
while(b){
// 当b的二进制最低1位为1的时候
if(b&1) res*=a;
// 3^{2^i}
a*=a;
// b右移1位
b>>=1;
}
return res;
}