快速幂,顾名思义,快速求幂。
a^b:朴素算法,即b个a相乘 时间复杂度O(n)
快速幂, 时间复杂度O(logn)
代码:
int Qpow(int a,int b){
int ans=1;
while(b!=0){
if(b&1!=0){ans*=a;}
a*=a;
b>>=1;
}
return ans;
}
原理:把b转化为二进制,该二进制第i位的值为2^(i-1),所以a对应 b的每一位值的幂是前一位值的幂的平方。即 第1位的权 a^1
第2位的权 a^2
第3位的权 a^4
……
例:7的二进制111,a^7 =(a^(2^0)) * (a^(2^1)) * (a^(2^2))=(a^1) * (a^2) * a(a^4)
10的二进制1010,a^10=(a^(2^1)) * (a^(2^3))=(a^2) * (a^8)
这样就可以从最低位开始处理了,
最低位为1,ans*=a;
最低位为0,不做处理。
b右移一位,a*=a;//维持a对应相应二进制位数的值。