question:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
resolution1:
该方法是一个比较投机取巧的方法,直接利用了Java的库函数,当然面试中还是不建议采取这种方法的
public double Power(double base, int exponent) {
double result = Math.pow(base, exponent);
return result;
}
resolution2:
该方法应该算是一个比较常规的方法,根据指数的大小分为>0,<0,==0三种情况
double Power(double base, int exponent) {
double result = 1;
if(exponent > 0){
for(int i = 1; i <= exponent; i++){
result *= base;
}
}else if(exponent < 0){
if(base == 0){
throw new RuntimeException("分母不能为0");
}else {
for(int i = 1; i <= Math.abs(exponent); i++){
result *= base;
}
result = 1 / result;
}
}
return result;
}
resolution3:快速求幂算法
我想出题人的意图应该就是利用P进制的移位算法来求解幂,通过该种算法,可以大大降低乘法次数。下面采用得是2进制算法。也可以采用8进制,16进制等等。只是current的步长就不是 平方,而是p进制的平方,比如八进制,那么current = 5的八次方 * 5的八次方
double Power(double base, int exponent) {
if(exponent < 0 && base == 0) throw new RuntimeException("分母不能为0");
if(base == 0) return 0;
int exponent1 = Math.abs(exponent);
double result = 1.0;
double current = base;
//判断最后一位二进制是否为1或者判断exponent1是否为奇数,将exponent1 & 1改为exponent1%2
while((exponent1 & 1) == 1){
result *= current;
current *= current;
exponent1 = exponent1 / 2;//也可以用右移代替
// exponent1 = exponent1 >> 1;
}
current *= current;
//输出判断
if(exponent < 0){
result = 1 / result;
}
return result;
}