题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
/**
* 原始方法:时间复杂度为O(exponent)
*
* @param base
* @param exponent
* @return
*/
public static double Power(double base, int exponent) {
if (base == 0.0){
return 0.0;
}
// 前置结果设为1.0,即当exponent=0的时候,就是这个结果
double result = 1.0d;
// 获取指数的绝对值
int e = exponent > 0 ? exponent : -exponent;
// 根据指数大小,循环累乘
for(int i = 1 ; i <= e; i ++){
result *= base;
}
// 根据指数正负,返回结果
return exponent > 0 ? result : 1 / result;
}
/**
* 优化方法:时间复杂度为log(exponent)
* 1.全面考察指数的正负、底数是否为零等情况。
* 2.写出指数的二进制表达,例如13表达为二进制1101。
* 3.举例:10^1101 = 10^0001*10^0100*10^1000。
* 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
* @param base
* @param exponent
* @return
*/
public static double OptimizePower(double base, int exponent) {
if (base == 0.0d) {
return 0.0;
}
int e = exponent > 0 ? exponent : -exponent;
double result = 1.0;
double current = base;
while (e != 0) {
// 如果当前位为1
if ((exponent & 1) == 1) {
result *= current;
}
current *= base;
e >>= 1;
}
return exponent > 0 ? result : 1 / result;
}