LeetCode 50 - Pow(x, n) - [快速冪]

實現 pow(x, n) ,即計算 x 的 n 次冪函數。函數

示例 1:spa

輸入: 2.00000, 10
輸出: 1024.00000code

示例 2:blog

輸入: 2.10000, 3
輸出: 9.26100遞歸

示例 3:io

輸入: 2.00000, -2
輸出: 0.25000class

解釋: 2^(-2) = 1/(2^2) = 1/4 = 0.25di

說明:while

-100.0 < x < 100.0
n 是 32 位有符號整數,其數值範圍是 [−2^31, 2^31 − 1] 。co

 

顯然,因爲 $n$ 是一個整數,能夠使用快速冪來作,對於 $n<0$ 的狀況,咱們能夠先求出 $x^{|n|}$,最後返回 $1/x^{|n|}$ 便可。

 

AC代碼:

class Solution
{
public:
    double myPow(double x,int n)
    {
        bool flag=(n>=0);
        long long p=abs((long long)n);
        double res=1, base=x;
        while(p)
        {
            if(p&1) res*=base;
            base*=base, p>>=1;
        }
        if(flag) return res;
        else return 1.0/res;
    }
};

 

簡單解釋快速冪的這段代碼,

我如今要計算的是 $base$ 的 $p$ 次方,那麼只要當 $p>0$,我就要繼續計算:

  若是 $p$ 是個偶數,那麼顯然 $base^p$ 能轉化成 $(base^2)^{p/2}$,那麼咱們如今轉而計算 $base^2$ 的 $p/2$ 次方;

  若是 $p$ 是個奇數,那麼顯然 $base^p$ 能轉化成 $(base^2)^{(p-1)/2} \cdot base$,那麼咱們依然要轉而計算 $base^2$ 的 $p/2$ 次方;

換句話說,快速冪有以下遞歸版本:

double fpow(double b,long long p)
{
    if(p==0) return 1.0;
    return fpow(b*b,p/2)*(p&1?b:1);
}

咱們將上述代碼寫成非遞歸形式即爲:

double fpow(double b,long long p)
{
    double res=1;
    while(p)
    {
        if(p&1) res*=b;
        b*=b, p/=2;
    }
    return res;
}
相關文章
相關標籤/搜索