快速幂算法

206 阅读1分钟

在进行幂运算时,往往是通过累计相乘的方法得到结果,但是这种方法效率低。 例如,当我们要计算9的7次方,通过累次相乘的方法如下:

97=99999999^7=9*9*9*9*9*9*9一共需要进行7次乘法。

快速幂提供了一种快速计算的思路:

当我们要计算上述问题时,

我们可以先转化为子问题97=9699^7=9^6*9

96=93939^6 = 9^3*9^3

因此,问题又转化为求解939^3。 同理:93=9299^3=9^2*9。而92=999^2=9*9

这样我们就用逐级递归的形式得到了979^7的答案,一共进行了4次计算。

92=999^2=9*993=9299^3=9^2*996=93939^6 = 9^3*9^397=9699^7=9^6*9

我们可以写出递归代码:

public int quickPow(int x,int n){
    int ans = 1;
    if(n==0){
       return 1;
    }elseif(n%2==1){
       return quickPow(x,n-1)*x;
    }else{
       int temp = quickPow(x,n/2);
       return temp*temp;
    }
}

递归的方法是倒序分解问题,直至问题规模不能再分,即找到①92=999^2=9*9后,再逐个递归。 另一种代码格式是正序计算:

public int quickPow(int x,int n){
    int ans = 1;
    while(n!=0){
       //(n&1)!=0说明对应二进制在最右边位为1,说明是奇数
       if((n&1)!=0) ans = ans * x;
       x = x*x;
       //x翻倍后,幂次减半,即右移一位
       n>>=1;
    }
}