Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

https://leetcode.com/problems/powx-n/

Implement pow(xn), which calculates x raised to the power n (xn).

Example 1:

Input: 2.00000, 10
Output: 1024.00000

Example 2:

Input: 2.10000, 3
Output: 9.26100

Example 3:

Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25

Note:

  • -100.0 < x < 100.0
  • n is a 32-bit signed integer, within the range [−231, 231 − 1]

解题思路:

这种math的题目本来就不擅长,看到题目tag里有binary search,很是疑问,不知道怎么解。直接写网友的思路吧,其实就是递归。

对幂数n折半递归,递归结束的条件为n达到0。如果n是2的整数倍,x^n就等于x^(n/2) * x^(n/2),否则就等于x^(n/2) * x^(n/2) * x。

但是若n < 0,结果就是 (1/x) ^ (n/2) * (1/x) ^ (n/2) * (1/x)

public class Solution {
    public double pow(double x, int n) {
        if(n == 0) {
            return 1;
        }
        double half = pow(x, n / 2);
        if(n % 2 == 0) {
            return half * half;
        } else if(n > 0){
            return half * half * x;
        } else {
            return half * half * (1 / x);
        }
    }
}

大神还提出另一个思路。我们将n看成一个2进制的数,那么n可以写成k0×2^0 + k1×2^1+kn×2^n。于是x^n就可以写成x^(k0×2^0) × x^(k1×2^1)×...×x^(kn×2^n)。

因为是2进制,所以这里k不是0就是1。2的幂数我们可以放在x上,于是我们可以一位一位的计算,循环迭代相乘。

具体要考虑x和n分别为负数的情况。代码如下。

public class Solution {
    public double pow(double x, int n) {
        if(n < 0) {
            x = 1 / x;
            n = 0 - n;
        }
        int negative = 1;
        if(n % 2 == 1 && x < 0) {
            negative = -1;
        }
        double result = 1d;
        x = Math.abs(x);
        while(n > 0) {
            if(n % 2 == 1) {
                result = result * x;
            }
            x = x * x;
            n = n >> 1;
        }
        return result * negative;
    }
}

不得不说,对数学计算的题目真的没有心得。但还是总结一下java里的位运算符吧。

向右移位 x>>1,就相当于x / 2。反之x <<1相当于x * 2。

按位与 (x & 1) == 1,就相当于 x % 2 == 1。特别注意&的优先级比==低,所以要加括号。

http://hehejun.blogspot.sg/2015/01/leetcodepow.html

http://fisherlei.blogspot.sg/2012/12/leetcode-powx-n.html

http://blog.csdn.net/linhuanmars/article/details/20092829

posted on 2015-04-21 16:24  NickyYe  阅读(716)  评论(1编辑  收藏  举报