题目
该系列文章题目和思路均参考自:《剑指Offer》- Page 110
解法
这个问题看似很简单,但其中需要考虑的点如下:
- 0的0次方没有意义,返回0或1需要进行设置。
- 底数base不为0时,指数为正则循环相乘求解。
- 底数base不为0时,指数为负,则需要先将指数取绝对值,然后取乘积的倒数,得到结果。
- 任何数的0次方都是1。
- 对于double和float数值,不能够使用简单的==进行数值是否相等的判断,需要自己定义是否相等的判断方法。
/**
* 求解base的exponent次方
*/
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;
}