美文网首页
算法-16.数值的整数次方

算法-16.数值的整数次方

作者: zzq_nene | 来源:发表于2020-08-14 14:55 被阅读0次

    实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

        /**
         * 数值的整数次方
         * 实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
         * 拆分的方式,即x的n次幂,可以看成是x*x的n/2次幂,不过需要判断n是奇数还是偶数,如果是奇数,则需要再乘以一个x
         * 以此类推,如果n是奇数,那么n/2是偶数,那么n/4就是奇数,此时将x*x看成是base,则x的n次幂可以看成是
         * x*(x*x)^(n/2)=x*((x*x)*(x*x*x*x)^(n/4))
         * 比如x=2,n=11,那么可以看成是2*(2*2)^(11/2),而在程序中,11/2=5,递归得到
         * 2*((2*2)*(2*2*2*2)^(5/2)),此时5/2=2,再一次递归,则将(2*2*2*2)看成是本次递归的base
         * 2*((2*2)*((2*2*2*2)*(2*2*2*2))^(2/2))
         * 计算方式,其实就是通过递归的方式,将base做平凡,而将次幂除以2,如果次幂除以2之后得到的是一个奇数,则在计算的时候需要优先乘以一个base
         * @param x
         * @param n
         * @return
         */
        private boolean isNegative = false;
        public double myPow(double x, int n) {
            if (n == 0) {
                return 1;
            }
            if (n == 1) {
                return x;
            }
            if (n < 0) {
                n = -n;
                isNegative = true;
            }
            double power = myPow(x * x, n / 2);
            // 如果n是奇数,则需要再乘以一个
            if (n%2 != 0) {
                power = power * x;
            }
            // 如果n是负数,则需要取反
            return isNegative?1/power:power;
        }
    

    相关文章

      网友评论

          本文标题:算法-16.数值的整数次方

          本文链接:https://www.haomeiwen.com/subject/mxgbrktx.html