50 快速幂

class Solution {

public: 

    double quickmul(double x,long long n){

        if(n==0)return 1.0;

        double y=quickmul(x,n/2);

        return n%2==0?y*y:y*y*x;

    }

    double myPow(double x, int n) {

        long long N=n;

        return N>=0?quickmul(x,N):1.0/quickmul(x,N);

    }

};



可以快速得到一个数的幂的算法,在很多地方都用得上,利用递归的思想来解决问题。

如果我们要计算 x^{64}x64,我们可以按照:x \to x^2 \to x^4 \to x^8 \to x^{16} \to x^{32} \to x^{64}x→x2→x4→x8→x16→x32→x64的顺序,从 xx 开始,每次直接把上一次的结果进行平方,计算 66 次就可以得到 x^{64}x64的值,而不需要对 xx 乘 6363 次 xx。再举一个例子,如果我们要计算 x^{77}x77,我们可以按照:x \to x^2 \to x^4 \to x^9 \to x^{19} \to x^{38} \to x^{77}x→x2→x4→x9→x19→x38→x77的顺序,在 x \to x^2x→x2,x^2 \to x^4x2→x4,x^{19} \to x^{38}x19→x38 这些步骤中,我们直接把上一次的结果进行平方,而在 x^4 \to x^9x4→x9,x^9 \to x^{19}x9→x19,x^{38} \to x^{77}x38→x77  这些步骤中,我们把上一次的结果进行平方后,还要额外乘一个 xx。直接从左到右进行推导看上去很困难,因为在每一步中,我们不知道在将上一次的结果平方之后,还需不需要额外乘 xx。但如果我们从右往左看,分治的思想就十分明显了:

作者:LeetCode-Solution

链接:https://leetcode-cn.com/problems/powx-n/solution/powx-n-by-leetcode-solution/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(50 快速幂)