快速幂

快速幂就是快速算底数的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相乘

其实任意一个n都可以拆成1000……的形式,也就是刚好是2^1、2^2、2^4……,这样一来我们就可以不断把底数平方就可以计算一个数的n次幂。

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;
}