首先的想法是pow(x,n)=pow(x,n/2)*pow(x,n-n/2),不过超时。
想到常数时间的解法:
n的第i位表示x的第2^i次方,可以先打一个32项的表,记录x的2^i次方。
然后根据n的第i位为1还是0,找到对应的x的2^i次方,把所有为1的乘起来就是。
是常数时间的。要考虑的情况:x=0,n>0;x=1;x=-1;n<0这几种情况
public class Solution {
public static double pow(double x, int n) {
if(x!=0 && n==0)
return 1;
if(x==0 && n>0)
return 0;
if(n==1 || x==1)
return x;
if(x==-1)
{
if((n%2)==0)
return 1;
else
return -1;
}
int flag=1;
if(n<0)
{
n=-n;
flag=-1;
}
double[] mi=new double[31];
double rst;
mi[0]=x;
int i;
for(i=1;i<31;i++)
{
mi[i]=mi[i-1]*mi[i-1];
}
rst=1;
for(i=0;i<31;i++)
{
// if(i<10)
// System.out.println("**"+mi[i]+" "+((n&(1<<i))>>i)+" ");
if(((n&(1<<i))>>i)==1)
rst*=mi[i];
}
if(flag==-1)
rst=1/rst;
return rst;
}
}