50. Pow(x, n)
"幂为奇数" ⇨ "二进制最低位为 1" ⇨ "当前这个 2ᵏ 项要包含在结果中"
题目:


题解:
java
class Solution {
public double myPow(double x, int n) {
if(x == 0.0f) {
return 0.0d;
}
//用快速幂进行计算
// 算法流程:
// 当 x=0.0 时:直接返回 0.0 ,以避免后续 1 除以 0 操作报错。分析: 数字 0 的正数次幂恒为 0 ; 0 的 0 次幂和负数次幂没有意义,因此直接返回 0.0 即可。
// 初始化 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)。
// 返回 res 。
//为了防止整数溢出,所以必须直接赋值给m,再进行-
long m = n;
double res = 1.0;
if(n<0) {
x=1.0/x;
m=-m;
}
while(m>0) {
//如果幂是奇数
if((m&1)==1) {
res*=x;
}
x*=x;
m>>=1;
}
return res;
}
}