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

package bit;

public class 数值的整数次方 {
    /**
     * 自想1:连乘
     * f(n) = f(n - 1) * base
     */
    public double Power1(double base, int exponent) {
        double cur = base;
        if (base == 0 && exponent <= 0) {
            throw new RuntimeException("valid input!");
        }
        if (exponent == 0) {
            return 1;
        } else {
            for (int i = 2; i <= Math.abs(exponent); i++) {
                cur *= base;
            }
        }
        return exponent > 0 ? cur : 1 / cur;
    }

    /**
     * 讨论区:用位运算代替连乘
     * 举例,13表达为二进制1101。
     * 10^1101 = 10^0001 * 10^0100 * 10^1000。
     * 通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
     */
    public double Power2(double base, int exponent) {
        double cur = 1, factor = base;
        int absExp = Math.abs(exponent);
        if (base == 0 && exponent <= 0) {
            throw new RuntimeException("valid input!");
        }
        if (exponent == 0) {
            return 1;
        } else {
            while (absExp != 0) {
                // 从右到左一位一位检验absExp
                if ((absExp & 1) != 0) {
                    cur *= factor;
                }
                // factor = (factor)²,base的平方,四次方,8次方...
                // 如果base是int的话,这里可以让base向左移动1位,2位,3位...得到factor
                factor *= factor;
                // absExp右移一位,即更高一位移到个位
                absExp >>= 1;
            }
        }
        return exponent > 0 ? cur : 1 / cur;
    }
}

results matching ""

    No results matching ""