数值的整数次方
约 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;
}