欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

两种方法求x的n次幂

程序员文章站 2022-07-12 12:17:28
...

一、递归方法

分析:
在求一个数x的n次幂时,可分为偶数和奇数两种情况来讨论,若x为偶数,则x^n=x^n/2 * x^n/2,若果x为奇数,则x^n=x^(n-1)/2 * x^(n-1)/2 * x。它的基准情况(无需递归即能解出)很明显,就是n==0和n==1时,n==0时,则任何数的0次幂均为1,n==1时,任何数的1次幂均为它本身。

有了上述分析后,代码就很容易写出了。

public class Pow {
    public static void main(String[] args) {
        System.out.println(pow(2, 5));
        System.out.println(pow(2, 10));
    }
    /*
     * 求x得n次幂
     */
    public static long pow(long x,long n){
        if(n==0){
            return 1;
        }
        if(n==1){
            return x;
        }
        if(x%2==0){
            return pow(x*x, n/2);
        }else{
            return pow(x*x, n/2)*x;
            /*return pow(x, n-1)*x;*/
            //n为奇数时,n-1即为偶数,因此可以写成x^n=x^n-1 * x,
            //因为x^n-1的值是偶数次幂情况时已求出
        }
    }

}

二、非递归方法

例子:
求x^5的值
5可以转成二进制,即101,5=2^2+2^0。
x^5因此可以写成x的2^2+2^0次幂。

我们知道一个数n,刚开始n%2==1的话,说明它转成二进制时,最低位为1,否则为0,下面进行n=n/2(n=n>>1)(右移操作);
如果再次进行n%2==1的话,说明此时的最低位为1,否则为0。

综上利用以上特性

public class Question23 {
    public static void main(String[] args) {
                System.out.println(Pow(3, 3));
                //27
    }

    public static int Pow(int x, int n) {
        int s = 1;
        while (n > 0) {
            if (n % 2 == 1)
                s *= x;
            x *= x;
            n >>= 1;//n=n/2;
        }
        return x;
    }
}

如果看不懂,不理解就找个例子代入,比如求4^11。
初始值x=4,n=11,s=1。
11的二进制表示为1011=1x2^3+0x2^2+1x2^1+1x2^0
第一次循环,n%2=1条件满足,s=4的1次方,x=4的2次方,n向右移动一位,即101
第二次循环,n%2=1条件满足,s=4的3次方,x=4的4次方,n继续向右移动一位,即10
第三次循环,n%2=1条件不满足,s=4的3次方没变,x=4的8次方,n继续向右移动一位,即1
第四次循环,n%2=1条件满足,s=4的11次方,此时x=4的16次方,n继续向右移动一位,即0
n>0条件不满足,结束循环。

看完这个过程,就应该明白了以下:
1011
       ↑
101
     ↑
10
  ↑
1
 ↑

1、x存在根本上是为了获得箭头所指的数在原本的数中的位权,因此依次为1,2,4,8
2、s存在根本上是为了求箭头所指数的和,因此为1,3,11。1101,其它位都为1,只有第三位为0,所以由3直接到11。
(4只是底数,不产生影响)

如果到这还不明白,建议多走几遍流程,便理解了。

For man is man and master of his fate

相关标签: 快速求幂