题目
实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。
解法
这个题目看起来很简单,很容易写出如下的代码:
POWER(double base, int exponent):
double result = 1.0;
for i = 1 to exponent(include):
result *= base;
return result;
但上面代码中没有考虑很多问题:
- 没有判断非法参数,0的0次方和负次方非法。
- 底数不为0时,指数为正,循环相乘。
- 底数不为0时,指数为负,则应该先将指数取绝对值,循环相乘后取倒数。
- 任何数的0次方都是1。
- 此外,double和float浮点型数值都有一定误差,在进行值判断时,也需要注意。
public class Power {
static final double EPS = 1e-9;
public static boolean IsEqual(double num1, double num2) {
if ((num1-num2)>-EPS && (num1-num2)<EPS)
return true;
else
return false;
}
public static double QuickPower(double base, int exponent) {
double result = 1.0;
while (exponent > 0) {
if ((exponent & 1) == 1) {
result = base * result;
}
base = base * base;
exponent = exponent >> 1;
}
return result;
}
public static double Power(double base, int exponent) {
if (IsEqual(base, 0.0)) {
return 0;
}
if (exponent == 0) {
return 1;
}
double result = QuickPower(base, abs(exponent));
if (exponent < 0) {
result = 1.0 / result;
}
return result;
}
}
以上为Java实现代码。