Pow(x, n)

Implement pow(x, n).

思路

这道题是一道数值计算的题目,因为指数是可以使结果变大的运算,所以要注意越界的问题。
如同我在Sqrt(x)这道题中提到的,一般来说数值计算的题目可以用两种方法来解,一种是以2为基进行位处理的方法,
另一种是用二分法。
二分法递归
public class Solution {
    public double myPow(double x, int n) {

        if (n > 0) {
            return power(x, n);
        } else {
            return 1 / power(x, -n);
        }
    }

    public double power(double x, int n) {
        if (n == 0) {
            return 1;
        }

        double half = power(x, n /2);

        if (n % 2 == 0) {
            return half * half;
        } else {
            return half * half * x;
        }
    }
}

非递归

  • 利用二进制与多项式分解,快速幂非递归实现
  • 这个思想太赞了,好些这种涉及幂次的非递归写法,都可以利用这个二进制与多项式
public double myPow(double x, int n) {
        // Write your code here
        boolean isNegative = false;
        if (n < 0) {
            x = 1 / x;
            isNegative = true;
            n = -(n + 1); // Avoid overflow when n == MIN_VALUE
        }

        double ans = 1, tmp = x;

        while (n != 0) {
            if (n % 2 == 1) {
                ans *= tmp;
            }
            tmp *= tmp;
            n /= 2;
        }

        if (isNegative) {
            ans *= x;
        }
        return ans;
    }

results matching ""

    No results matching ""