实现 pow(x, n) ,即计算 x 的 n 次幂函数。
公式:
当n为负数,
注意需要特殊数据:底数为0且指数为负数的情况。
复杂度为O(lgn)。
代码实现:
public class Solution {
public double myPow(double x, int n) {
if (Double.compare(x, 0) == 0 && n < 0) {
// 整数位0,指数为负数的情况
throw new RuntimeException("非法输入,除数不能为0");
}
long absN = n;
if (n < 0) {
// 负数
absN = -absN;
return 1.0 / PowerWithUnsigned2(x, absN);
}
// 正数
return PowerWithUnsigned2(x, absN);
}
/**
* 递归 O(lgn)
* @param base
* @param exponent
* @return
*/
private double PowerWithUnsigned(double base, long exponent) {
// 边界
if (exponent == 0) {
return 1;
}
if (exponent == 1) {
return base;
}
// exponent >> 1 代替除以2
double result = PowerWithUnsigned(base, exponent >> 1);
result *= result;
if ((exponent & 1) == 1) {
// 与运算代替 exponent % 2 == 1
result *= base;
}
return result;
}
/**
* 非递归
* @param base
* @param exponent
* @return
*/
private double PowerWithUnsigned2(double base, long exponent) {
double result = 1;
while (exponent != 0) {
if ((exponent & 1) == 1) {
result *= base;
}
base *= base;
exponent >>= 1;
}
return result;
}
}
类似的题:超级次方