问题描述
实现自己的次幂函数,返回x^n的值。
解题思路
解题思路参考自这篇博客
1. 利用递归
依次递归求解double res=Pow(x,n/2),然后返回res*res或者res*res*n(前者n为偶数,后者为奇数);而不是直接返回Pow(x,n/2)*Pow(x,n/2)或者Pow(x,n/2)*Pow(x,n/2)*x。另外,需要考虑边界的问题,如果x=0,x=1,x<0,以及x=Integer.MIN_VALUE。
2. 利用动态规划
我们可以尝试将x^n分解,以x^13为例,13的二进制数为1101,上式可以分解为
m13=m8∗m4∗m1
,可以得出结论:二进制数的第一位对应值为
m1
,第二位对应值为第一位的平方
m2
,第三位对应值为第二位的平方
m4
,依次类推;并得知如果该位是1,所得的最终解需要乘以改位所对应的值;
代码
递归
public class Solution {
public double myPow(double x, int n) {
if(n==0)
return 1;
if(n==1)
return x;
int tem=n/2;
if(n<0){
tem=-tem;
x=1/x;
}
double res=myPow(x,tem);
if(n%2==0)
return res*res;
return res*res*x;
}
}
动态规划
public class Solution {
public double myPow(double x, int n) {
if(n==0)
return 1;
if(n==1)
return x;
int m=(n<0?-n-1:n);//处理n为负数的情况
double result=1;
for(double p=x;m>0;m/=2){
if((m & 1)!=0)
result*=p;
p*=p;
}
if(n<0){
return 1/result/x;
}
return result;
}
}