虽然这道题是中等题,但是思路很简单,暴力法代码也很简单
法1:暴力法,但是会运行超时
public static double myPow(double x, int n) {
if(n<0){
x=1/x;
n=-n;
}
double ans = 1;
for (int i = 0; i <n ; i++) {
ans *= x;
}
return ans;
}
法2:分治算法,递归
暴力法思路,如果x=2,n=10,那么我们要用x乘以10次
但是我们可不可以分解一下,2的10次方分解为2^5 * 2^5 再分解:(2^2 * 2^2 * 2)*(2^2 * 2^2 * 2)
这样看的话如果求x^64我们就不需要乘64次了
变成:x—>x^2—>x^4—>x^8—>x^16—>x^32—>x^64
x^65:x—>x^2—>x^4—>x^8—>x^16—>x^32—>x^64—>x^65
也就是奇数次的话最后多乘以一个x就好了
public static double myPow2(double x, int n) {
long N = n;//防止n本身的越界
return N >= 0 ? myPowHelper(x, N) : 1.0 / myPowHelper(x, -N);
}
public static double myPowHelper(double x, long n) {
if(n == 0){
return 1.0;
}
double y = myPowHelper(x, n / 2);
return n % 2 == 0 ? y * y : y * y * x;//判断次数的奇偶性
}