public class 面试题16 {
public static double Power(double base, int exponent) throws Exception {
double result = 0.0;
if (base == 0.0 && exponent < 0)
throw new Exception("非法输入");
boolean abs = false;
if (exponent < 0) {
abs = true;
exponent = Math.abs(exponent);
}
result=PowerWithUnsignExponent(base, exponent);
if (abs==true) {
result=1.0/result;
}
return result;
}
public static double PowerWithUnsignExponent(double base, int exponent){
double result=1,b=base;
while (exponent!=0) {
if((exponent&1)!=0)
result*=b;
b*=b;
exponent>>=1;
}
return result;
}
}
- 要考虑特殊指数负值,零值的特殊情况
- 利用快速幂计算乘方能将时间复杂度降为O(logn)
- 用循环代替递归,减少对栈的消耗