Weiss数据结构与算法--练习2.23(幂运算)

package cn.yjnull.datastrhomework;
/**
 * 幂运算
 * @author Yjnull
 *
 */
public class DataStr2_23_Pow {
    /*
     * 递归求幂
     */
    public static double pow(double x,int n){
        if(0==n) return 1;
        if(1==n) return x;
        if(n%2==0) //if n是偶数
            return pow(x*x,n/2);
        else
            return pow(x*x,n/2)*x;
    }

    /*
     * 非递归快速求幂
     */
    public static double notRecursivePow(double x,int n){
        double result = 1;
        /**
         * 例:x=3,n=9
         * 1. n&1!=0 result=3  --> n=4 --> x = 3*3=3^2
         * 2. n&1==0 --> n=2 --> x = 3^2 * 3^2=3^4
         * 3. n&1==0 --> n=1 --> x = 3^8
         * 4. n&1!=0 result=3*3^8=3^9 --> n=0 --> x=3^16
         * 5. return 3^9;
         */
        while(n>0){
            if((n&1)!=0) //等价n%2!=0
                result *= x; 
            n >>= 1; // 等价n/2
            x *= x;
        }
        return result;
    }

    public static void main(String[] args) {
        long time1,time2;
        time1 = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            pow(6, 1000);
        }
        time2 = System.currentTimeMillis();
        System.out.println("pow:"+(time2-time1)+"ms");//pow:230ms

        time1 = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            notRecursivePow(6, 1000);
        }
        time2 = System.currentTimeMillis();
        System.out.println("notRecursivePow:"+(time2-time1)+"ms");//notRecursivePow:126ms

        time1 = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            Math.pow(6, 1000);
        }
        time2 = System.currentTimeMillis();
        System.out.println("Math.pow:"+(time2-time1)+"ms");//Math.pow:4ms 几乎固定在4ms左右
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值