跳至主要內容

数值的整数次方

soulballad算法剑指Offer剑指Offer约 298 字小于 1 分钟

题目:

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

方法一:循环

​ 注意考虑输入的两个参数,可以是正数、负数、0、整数、小数等多种类型。

public static double powIter(double base, int exponent) {

    if (BigDecimal.ZERO.equals(BigDecimal.valueOf(base))) {
        return 0;
    }

    if (exponent == 0) {
        return 1;
    }

    int flag = exponent;
    exponent = Math.abs(exponent);  // 取绝对值

    double result = powWithExponent(base, exponent);

    if (flag < 0) {
        result = 1.0 / result;
    }
    return result;
}

private static double powWithExponent(double base, int exponent) {
    double result = 1;
    for (int i = 1; i <= exponent; i++) {
        result = base * result;
    }
    return result;
}

方案二: 递归

​ 上面的方案, exponent 为 16 时,则循环中要执行 15 次乘法。可以换一种思路:要求 16 次方,如果已经知道 它的 8次方值,只需再平方即可;同理 8 次方可由 4 次方平方所得。

public static double powRecurs(double base, int exponent) {
    if (exponent == 0) {
        return 1;
    }

    if (exponent == 1) {
        return base;
    }

    double result = powWithExponent(base, exponent >> 1);
    result *= result;

    if ((exponent & 0x1) == 1) {
        result *= base;
    }

    return result;
}

private static double powWithExponent(double base, int exponent) {
    double result = 1;
    for (int i = 1; i <= exponent; i++) {
        result = base * result;
    }
    return result;
}
上次编辑于:
贡献者: soulballad