给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

    题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

        /**
         * 原始方法:时间复杂度为O(exponent)
         *
         * @param base
         * @param exponent
         * @return
         */
        public static double Power(double base, int exponent) {
            if (base == 0.0){
                return 0.0;
            }
            // 前置结果设为1.0,即当exponent=0的时候,就是这个结果
            double result = 1.0d;
            // 获取指数的绝对值
            int e = exponent > 0 ? exponent : -exponent;
            // 根据指数大小,循环累乘
            for(int i = 1 ; i <= e; i ++){
                result *= base;
            }
            // 根据指数正负,返回结果
            return exponent > 0 ? result : 1 / result;
        }
     /**
         * 优化方法:时间复杂度为log(exponent)
         * 1.全面考察指数的正负、底数是否为零等情况。
         * 2.写出指数的二进制表达,例如13表达为二进制1101。
         * 3.举例:10^1101 = 10^0001*10^0100*10^1000。
         * 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
         * @param base
         * @param exponent
         * @return
         */
        public static double OptimizePower(double base, int exponent) {
            if (base == 0.0d) {
                return 0.0;
            }
            int e = exponent > 0 ? exponent : -exponent;
            double result = 1.0;
            double current = base;
    
            while (e != 0) {
                // 如果当前位为1
                if ((exponent & 1) == 1) {
                    result *= current;
                }
                current *= base;
                e >>= 1;
            }
            return exponent > 0 ? result : 1 / result;
        }
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值