實現 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; }