数值的整数次方

《剑指offer》面试题16:数值的整数次方

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

即全面又高效的解法:
当exponent为偶数时,例如exponent=32,如果我们已经知道了base的16次方,那么只需要在16次方的基础上再平方一次即可。而16次方是在8次方的基础上再平方一次...以此类推,求32次方只需要5次乘法:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,在16次方的基础上求32次方。
当exponent为奇数时,例如exponent=33,如果我们已经知道了base的32次方,那么只需要在32次方的基础上再乘以base即可。而32次方是偶数的计算方法。

代码如下:

public static double Power(double base,int exponent) {
    // 对0求倒数不合法
    if (base == 0 && exponent < 0) {
        throw new RuntimeException("input invalid");
    }
    // 0的0次方在数学上无意义
    if (base == 0 && exponent == 0) {
        return 0;
    }
    int absExponent = exponent < 0 ? -exponent : exponent;
    double result = PowerCore(base,absExponent);
    return exponent < 0 ? 1.0 / result : result;
}

private static double PowerCore(double base,int exponent) {
    if (exponent == 0) {
        return 1;
    }
    if (exponent == 1) {
        return base;
    }
    // 右移运算符代替除以2
    double result = PowerCore(base,exponent >> 1);
    result *= result;
    // 位与运算符判断奇数
    if (exponent & 1 == 1) {
        result = result * base;
    }
    return result;
}

你可能感兴趣的:(数值的整数次方)