快速幂
快速幂就是快速算底数的n次幂。其时间复杂度为O(log₂N),朴素的直接乘的复杂度为O(N),显然快速幂效率有很大的提高。
解决问题:计算一个数的n次方
例如计算2的10方,我们通常直接222......2这样去计算,这样的话太慢了,用代码表示就是
int ans = 1
for(int i = 0; i < 10; i++){
ans *= 2;
}
现在我们换个角度引入快速幂来看,也就是从二进制的角度来看,将需要乘方的次数转换成二进制来看就是10010
也就是说我们现在要计算2的(10010)(二进制)次幂,那么我们要怎么做才能更快地计算呢?
首先,我们可以将10010拆分为10000和10,也就是相当于2^8和2^2相乘
java代码实现
public int quickPow(int a, int n){
int ans = 1;
while(n > 0){
if((n & 1) > 0){//判断最后一位是否为1
ans *= a;//是1的话就乘一次
}
a *= a;//每一位a都自乘一次
n >>= 1;//n右移一位
}
return ans;
}