利用数学里边的快速幂思想:
将n化成二进制数,进行位运算,x*=x,实现了x从低位开始依次得到x^ 2,x ^4,x ^8…,同时幂n右移,右移过程中遇到幂当前位有1,那么记录此时的x,
实现过程:
当 x = 0时:直接返回 0 (避免后续 x = 1 / x )。
初始化 res = 1;
当 n < 0时:把问题转化至 n≥0 的范围内,即执行 x = 1/x ,n = - n;
循环计算:当 n=0 时跳出;
当 n&1=1 时:将当前 x 乘入 res (即 res *= x);
执行 x = x^2即x∗=x );
执行 n 右移一位(即 n >>= 1)。
class Solution {
public double myPow(double x, int n) {
if(x==0)return 0;
long mi=n;
if(mi<0){
x=1/x;
mi=-mi;
}
double res=1.0;
while(mi>0){
if((mi&01)==1)res *=x;
x*=x;
mi>>=1;
}
return res;
}
}