解题思路:
这道题的意思就是求x的n次方。
如果xx求下去,求n-1次,这样是超时的。
我的思路是,首先求xx,然后n就可以减少2,然后求(xx)(x*x),这样n就可以减少4…
就是n不是-1、-1、-1…这样减下去,而是-2、-4、-8…这样减下去
迭代cnt次后,可以让n减少2^(cnt)-1(次)(等比求和),cnt是这么求的:
int cnt=(int)Math.floor(Math.log(n)/Math.log(2));
然后看n还剩下多少,对n进行递归
用一个一位的数组res(result)来记录结果的原因是,我想通过calculatePow来改变两个变量的值,res和n。如果将res设为一个单纯的double变量,无法通过子函数改变res的值,只能建立一个数组,然后将res的值的存到数组里,再将数组传递进入子函数,才能改变这个值。
提交代码:
class Solution {
public double myPow(double x, int n) {
if(n==0) return (double)1;
if(x==1) return (double)1;
if(x==-1){
if(n%2==0) return (double)1;
else return (double)(-1);
}
if(n==Integer.MIN_VALUE) return 0;
double res[]=new double[1];
res[0]=1;
boolean flag1=n>0?true:false; //判断是否取倒数
int flag2=(x<0)&&(n%2!=0)?-1:1;
n=Math.abs(n);
x=Math.abs(x);
while(n>1)
n=calculatePow(x,n,res);
res[0]*=x;
if(flag1) return (double)(flag2*res[0]);
else return (double)(flag2*1/res[0]);
}
public int calculatePow(double x,int n,double[] res) {
int fold=1;
double base=x;
int cnt=(int)Math.floor(Math.log(n)/Math.log(2));
for(int i=0;i<cnt;i++) {
res[0]*=base;
base*=base;
n-=fold;
fold*=2;
}
return n;
}
}
运行结果: