Pow(x, n)
Implement pow(x, n).
思路
这道题是一道数值计算的题目,因为指数是可以使结果变大的运算,所以要注意越界的问题。
如同我在Sqrt(x)这道题中提到的,一般来说数值计算的题目可以用两种方法来解,一种是以2为基进行位处理的方法,
另一种是用二分法。
二分法递归
public class Solution {
public double myPow(double x, int n) {
if (n > 0) {
return power(x, n);
} else {
return 1 / power(x, -n);
}
}
public double power(double x, int n) {
if (n == 0) {
return 1;
}
double half = power(x, n /2);
if (n % 2 == 0) {
return half * half;
} else {
return half * half * x;
}
}
}
非递归
- 利用二进制与多项式分解,快速幂非递归实现
- 这个思想太赞了,好些这种涉及幂次的非递归写法,都可以利用这个二进制与多项式
public double myPow(double x, int n) {
boolean isNegative = false;
if (n < 0) {
x = 1 / x;
isNegative = true;
n = -(n + 1);
}
double ans = 1, tmp = x;
while (n != 0) {
if (n % 2 == 1) {
ans *= tmp;
}
tmp *= tmp;
n /= 2;
}
if (isNegative) {
ans *= x;
}
return ans;
}