面试题 11:数值的整数次方
tag: 位运算 补码 负数 越位
leetcode: 50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。
// 乘方的暴力破解是:X^n = X*X..*X
// x的边界条件,为0
// 功能条件, n>0, N < 0, n =0
// 分治,即 5^4 == 5^2 * 5^2 -> 即 temp =5^2 , 5^4= temp * temp
// n的奇偶影响分组,只要是二分分组,都要考虑奇偶性
// N可以分为几次,就是多少个平方的平方
public double myPow(double x, int n) {
if (x == 0 || n == 1) {
return x;
}
if (n < 0) {
// 取倒数,并且要把N变成正数
// 埋着坑,补码问题,n =-2147483648,当-n传下去的时候,会超长
return 1.0d / pow(x, -(long) n);
}
return pow(x, n);
}
public double pow(double x, long n) {
double result = 1.0d;
double currentBase = x;
while (n > 0) {
//此时还要增加一个判断 ,即n是奇偶数, if (n % 2 == 1)
if ((n & 1) == 1) {
// 奇数,则结果增加一个原底数
// 不是原底数,而是小上一次的底数,因为N一定会右移成1,所以最后一次也一定会计算
result *= currentBase;
}
// 累计平方, 初始化时X,但每次循环后,result变成上一次循环前的平方
currentBase *= currentBase;
// 相当于除以2
n = n >> 1;
}
return result;
}

被折叠的 条评论
为什么被折叠?



