快速幂
快速幂 : 简而言之呢就是 快速取幂嘛 相对于普通取幂有什么区别呢
先来看普通取幂
long long power(int a,int b){
long long sum=1;
for(int i=0;i<b;i++){
sum*=a;
}
return sum;
}
显而易见的是 我们计算a 的 b 次时 需要连续 * a b 次 那么他的时间复杂度则为O(n)
而快速幂是用了什么方法使时间复杂度下降的呢
想象一下当我们计算3的13次方时
3^13 = 3^2^3 * 3^2^2 * 3*2^0;
而13的二进制码等于1101 此时我们发现 可以利用二进制来快速的进行幂运算 此时时间复杂度则变成了log2(n)
而且我们发现在二进制码中 1 才带来价值 所以我们只需要一直将该二进制码右移动的来取 其有效位 再乘上他的基数就好了
二进制——————————基数—————————— 结果
1101———————————3———————————— 3
110 ———————————9 ————————————3
11————————————81————————————3 * 81
1————————————6561——————————3 * 81 * 6561
由此可得再写出代码
long long quickpower(int a,int b){
long long sum=1;
long long base=a;
while(b){
if(b&1){
sum*=base;
}
b>>=1;
base*=base;
}
return sum;
}