数值的整数次方

作者: lvlvforever | 来源:发表于2018-07-17 14:11 被阅读6次

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

第一种

根据幂的定义来计算。

  public double Power(double base, int exponent) {
        int absExp = Math.abs(exponent);
        double result = 1.0;
        for (int i = 0; i < absExp; i++) {
            result *= base;
        }
        if (exponent < 0) {
            result = 1 / result;
        }
        return result;
    }

以上程序可以通过牛客的测试用例,不过没有对base exponent的范围进行开考虑和限制。

第二种

考虑2^5,相当于 (2^2) * (2^2) * 2,也就是我们将exponent使用折半计算在相乘的技巧减少计算的次数。下面先用递归实现这种技巧。

public double Power(double base, int exponent) {
        if (isZero(base)) { //判断base是否是特殊值
            return 0.0;
        }
        if (exponent == 1) {
            return base;
        } else if (exponent == 0) {
            return 1.0;
        }
        int absExp = Math.abs(exponent);
        double result = 0.0;
        result = compute(base, absExp);
        if (exponent < 0) {
            result = 1 / result;
        }
        return result;

    }

    private double compute(double base, int exp) {
        if (exp == 1) {
            return base;
        } else if (exp == 0) {
            return 1.0;
        }
//使用移位操作来代替除法操作 这样更加高效
        double result = compute(base, exp >> 1);
        result *= result;
// 同样使用位运算来代替求余操作 
        if ((exp & 0x1) == 1) {
            result *= base;
        }
        return result;

    }
    private boolean isZero(double base) {
// 不要对double值使用==判断是否是0
        if (Math.abs(base - 0) < 0.0000000001) {
            return true;
        }
        return false;
    }

以上代码需要注意的首先是对base exponent值进行了考虑和限制,其次是递归的使用,最后使用了位运算来代替除法和求余操作,提高了效率。

第三种

这里使用迭代来实现上面的计算技巧。

 public double Power(double base, int exponent) {
        if (isZero(base)) {
            return 0.0;
        }
        if (exponent == 1) {
            return base;
        } else if (exponent == 0) {
            return 1.0;
        }
        int absExp = Math.abs(exponent);
        double result = base;

        boolean isOdd = ((absExp & 1) == 1);
        if (isOdd) {
            absExp = absExp - 1;
        }
        absExp = absExp >> 1;
        while (absExp != 0) {
            result *= result;
            absExp = absExp >> 1;
        }
        if (isOdd) {
            result *= base;
        }
        if (exponent < 0) {
            result = 1 / result;
        }
        Math.pow(base, 10.0);
        return result;

    }
    private boolean isZero(double base) {
        if (Math.abs(base - 0) < 0.0000000001) {
            return true;
        }
        return false;
    }

相关文章

  • 《剑指 Offer (第 2 版)》第 16 题:数值的整数次方

    第 16 题:数值的整数次方(快速幂) 传送门:AcWing:数值的整数次方,牛客网 online judge 地...

  • 剑指offer(十二)数值的整数次方

    数值的整数次方 是为了考察代码完整性点击进入 牛客网题库:数值的整数次方 题目描述:给定一个double类型的浮点...

  • 数值的整数次方

    题目描述: 解析一: 初看,就是求一个 double类型的数值的n次方,用代码来写就是n次数值相乘。但是,这道题的...

  • 数值的整数次方

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

  • 数值的整数次方

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

  • 数值的整数次方

    https://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417...

  • 数值的整数次方

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

  • 数值的整数次方

    《剑指offer》面试题16:数值的整数次方 题目:实现函数double Power(double base,in...

  • 数值的整数次方

    ?环境:牛客的编译环境?语言:JavaScript☕️难点:没有考虑到底数为0,指数为负数和正数的不同情况。?题目...

  • 数值的整数次方

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

网友评论

    本文标题:数值的整数次方

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