两种方法求x的n次幂

一、递归方法

分析:
在求一个数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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页