【定义】快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
【举例】
以下以求a的b次方来介绍
把b转换成二进制数。
该二进制数第i位的权为2^(i-1)
例如a^11=a^(2^0+2^1+2^3)
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算a^(2^0)*a^(2^1)*a^(2^3)
【实现】
快速幂可以用位运算这个强大的工具实现
b&
1
{也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
b>>
1
{就是去掉b的二进制最低位(即第0位)}
【代码】
1、常规求幂
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int pow1(inta,intb) 2 { 3 int r=1; 4 while(b--) 5 r*=a; 6 return r; 7 }
2、二分求幂(一般)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int pow2(inta,intb) 2 { 3 int r=1,base=a; 4 while(b!=0) 5 { 6 if(b%2) 7 r*=base; 8 base*=base; 9 b/=2; 10 } 11 return r; 12 }
3、二分求幂(位操作)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int pow3(int a,int b) 2 { 3 int r=1,base=a; 4 while(b!=0) 5 { 6 if(b&1) 7 r*=base; 8 base*=base; 9 b>>=1; 10 } 11 return r; 12 }
4、快速幂(位运算)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int pow4(int x,int n) 2 { 3 if(n==0) return 1; 4 else 5 { 6 while((n&1)==0) 7 { 8 n>>=1; 9 x*=x; 10 } 11 } 12 int result=x; 13 n>>=1; 14 while(n!=0) 15 { 16 x*=x; 17 if((n&1)!=0) 18 result*=x; 19 n>>=1; 20 } 21 return result; 22 }