快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
原理:
以下以求a的b次方来介绍
把b转换成二进制数。
如:a¹¹ = a^(2º+2¹+2³)
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算 a^2º × a^2¹ × a^2³
代码比较:
常规求幂
View Code

1 int pow1(inta,intb){
2 int ans=1;
3 while(b--)
4 ans*=a;
5 return ans;
6 }
二分求幂(一般)

1 int pow2(inta,intb){
2 int ans=1 , temp=a;
3 while(b){
4 if(b%2)
5 ans*=temp;
6 temp*=temp;
7 b/=2;
8 }
9 return ans;
10 }
快速求幂(位操作)

1 int pow3(inta,intb){
2 int ans = 1 , temp = a ;
3 while(b){
4 if(b&1) //b%2 = b&1
5 ans*=temp;
6 temp*=temp;
7 b>>=1; //b/2 = b>>1
8 }
9 return ans;
10 }