如果只是简单的将x循环n次进行乘积的话,一定会超时,所以,这里采用了对半分的方法,先看代码:
double myPow(double x, int n) {
double res=1.0;
for(int i=n;i!=0;i/=2)
{
if(i%2!=0)
res*=x;
x*=x;
}
return n<0 ? 1/res : res;
}
我们可以看一个例子,x=2,n=10;
1.i=10 res=1,x=4
2.i=5 res=4,x=16
3.i=2 res=4,x=256
4.i=1 res=1024,x=256*256
所以最后res=1024
这里面有一个技巧性的地方在于,我们的i/=2,虽然是对半分,但是我们x在不断的回滚,往上乘,保留我们i/2丢失的幂次。