实现 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;
}
}
类似的题:超级次方
本文深入探讨了快速幂算法,一种高效计算x的n次幂的方法,特别关注于底数为0且指数为负数的特殊情况处理。算法复杂度达到O(lgn),并提供了递归与非递归两种实现方式,适合于解决类似超级次方的问题。
4516

被折叠的 条评论
为什么被折叠?



