代码:
class Solution {
public double myPow(double x, int n) {
int len = Math.abs(n);
if(len==0) return 1;
if(len==1){
if(n>0) return x;
return 1/x;
}
if(len==2){
if(n>0) return x*x;
return 1/(x*x);
}
//因为n<0是1/x^n算出来的,但是n绝对值最大是2^31 − 1,负数存在2^31所以进行单独判断,否则会溢出
if(n==-2147483648){
if(x==1||x==-1) return 1;
else return 0;
}
//开辟动态数组存储1-100次方的值
double dp[] = new double[101];
dp[0]=1;
dp[1]=x;
for(int i=2;i<101;i++){
if(i%2==0){
dp[i]=dp[i/2]*dp[i/2];
}else{
dp[i]=dp[i/2]*dp[i/2]*dp[1];
}
}
double res=1;
while(len>0){
for(int i=100;i>=0;i--){
if(len-i>=0){
res*=dp[i];
len-=i;
break;//这里一定要加break,可以尽可能选最大次幂进行相乘
}
}
}
return n>=0? res:1/res;
}
}