class Solution {
public:
double myPow(double x, int n) {
if(n==0||x==1) return 1;
if(x==0) return 0;
double pro=1;
long long p=abs((long long)n); //(1)
while(p){
if(p&1) pro*=x; //(2)
p=p>>1; //(3)
x*=x;
}
return (n>0)?pro:1/pro;
}
};
(1)处:此处考虑了n为负数时候的情况,为了计算方便,先将n取绝对值,但是当n为INT_MIN,即-214748364时,若p仍为int型变量,p最大只能表示2147483647,会发生溢出,所以要改成long long类型。
(2)处:判断p是奇数还是偶数,若是奇数,与1做&运算后,结果是1,若是偶数则是0;
(3)处:将p左移1位,即除以2;
该算法的时间复杂度为log(N),思路为:将基数x不断做平方运算,同时指数n不断除2,直到指数n等于0为止,但是由于指数存在奇数的情况,所以遇到指数为奇数的情况,就将基数单独乘在乘积中;最后求出pro后,若n为负数,则取倒数,得到结果。
如求2^13:
x=2,n=13,p=n=13;
p= 13是奇数,所以pro=pro*x=2,p=p/2=6,x=4;
p= 6是偶数,所以pro=2不变,p=p/2=3,x=4^2=16;
p= 3是奇数,所以pro=pro*x=32,p=p/2=1,x=16^2=256;
p= 1是奇数,所以pro=pro*x=8192,p=p/2=0,x=256^2(此时这个数已经不重要了);
p=0,退出循环,pro=8192;