[LeetCode]50 Pow(x, n)

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

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

public class Solution {
    public double pow(double x, int n) {
        // Solution A:
        // return pow_Recursion(x, n);
        
        // Solution B:
        return pow_Shift(x, n);
    }
    
    ////////////////////////
    // Solution B: Number
    //
    // Any num can be represented by 2.
    private double pow_Shift(double x, int n)
    {
        if (x == 0)
            return 0d;

        if (n == 0)
            return 1d;
            
        boolean neg = n < 0;
        n = Math.abs(n);
        
        double r = 1d;
        while (n > 0)
        {
            if (n % 2 == 1)
                r *= x;
            x *= x;
            n = n >> 1;
        }
        
        if (neg)
            return 1 / r;
        return r;
    } 
        
    ////////////////////////
    // Solution A: Recursion
    //
    private double pow_Recursion(double x, int n)
    {
        // x ^n = 
        // x ^ (n / 2) * x (n / 2) * x (n % 2)
        if (x == 0)
            return 0;

        if (n > 0)
            return p(x, n);
        else
            return 1 / p(x, -n);
    }
    
    private double p(double x, int n)
    {
        if (n == 0)
            return 1;
        
        double v = p(x, n / 2);
        if (n % 2 == 0)
            return v * v;
        else 
            return v * v * x;
    }
}



你可能感兴趣的:(LeetCode)