LeetCode-剑指16-数值的整数次方

LeetCode-剑指16-数值的整数次方_第1张图片

1、递归实现快速幂

快速幂的本质在于分治法,我们想要求得 x n x^n xn时先递归计算出 y = x ⌊ n 2 ⌋ y=x^{\left \lfloor \frac{n}{2} \right \rfloor } y=x2n的值。当 n n n为偶数时,我们令 x n = y 2 x^n=y^2 xn=y2;当 n n n为奇数时,我们令 x n = y 2 × x x^n=y^2\times x xn=y2×x

class Solution {
public:
    double myPow(double x, int n) {
        if (!n) return 1;
        if (abs(n) == 1) return n >= 0 ? x : 1 / x;
        double a = myPow(x, n >> 1);
        return n % 2 ? a * a * x : a * a;
    }
};

2、迭代实现快速幂

具体思想同上

class Solution {
public:
    double quickMul(double x, long long N) {
        double ans = 1.0;
        double x_contribute = x;
        while (N > 0) {
            if (N % 2 == 1) {
                ans *= x_contribute;
            }
            x_contribute *= x_contribute;
            N /= 2;
        }
        return ans;
    }

    double myPow(double x, int n) {
        long long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }
};

你可能感兴趣的:(LeetCode刷题记录,LeetCode-待复习,leetcode,c++,算法)