1.思路:使用快速幂,将x的a次方的值数a转换为2进制的形式,即x ^ a = x^ (1 * b1) * x^ (2 * b2) * x^ (4 * b3) * …,bi为0或者1
2.代码:
class Solution {
public double myPow(double x, int n) {
if(n == 0) return 1;
double res = 1.0;
//当n为负数时,例如2的-3,做法是将2变为小数,-3变为正3,由于int的范围是[-2147483648,2147483647],将其变为正数可能越界,所以使用long
long b = n;
if(b < 0){
//由于x为小数,则不会像 1 / 2 = 0
x = 1 / x;
b = -b;
}
//使用快速幂,要求x的a次方,可以将a转为二进制的形式: a = 2 * b1 + 2 * b2 ... + 2 * bi + c
//x的a次方 = x ^ (2 * b1) * x ^ (2 * b2) *... * x ^ c
//例如求6的11次方,就等于 6 ^ (2进制1011) = 6 ^ (2 * 3) * 6 ^ (2 * 1) * 6 ^ (2 * 0)
//可以理解:6的11次方等于6的8次方 * 6的2次方 * 6的1次方,在循环的时候,res和x都循环赋值。
while(b > 0){
//利用与运算,逐次求b的二进制最后一位,如果为1,则循环赋值x = x ^ 2
if((b & 1) != 0)res *= x;
x *= x;
//右移一位,相当于去掉最后一位
b = b >> 1;
}
return res;
}
}