实现Math.pow(x,n)----巧妙使用二进制
题目:Pow(x,n)
[解法]也来自于LeetCode官方.
题目描述:
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0 n 是 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。 对于计算结果X^n,可以表示为: X^n = X^i1 * X^i2 * ......* X^in = X(i1+i2+......+in) 所以可以找到一组数字i1~in和为n. 十进制和二进制转化是: A = a1*2^0+a2*2^1+.....+an*2^n.其中a1......an:{0|1}. 所以我们可以使用二进制来表示题目中的指数部分. 这样的话,就可以轻易地计算出最后的结果了. java实现: public double myPow(double x, long n) { double baseNum = Math.abs(x); long absN = Math.abs(n); double result = 1; long mod=0; while(absN/2>0){
mod = absN%2;
if(mod == 1){
result*=baseNum;
}
baseNum = baseNum*baseNum;
absN = absN/2;
}
if(absN%2 == 1){
result *=baseNum;
}
if(n%2!=0 && x<0){
result = -result;
}
if(n<0){
result = 1.0/result;
}
return result;
}
注意,提交模板中给的参数n是int,但是如果用int接收Integer.maxValue,在进行取绝对值后,仍旧会是负数,所以将参数n转为long.
例如用例:x=2,n=-2147483648.

浙公网安备 33010602011771号