劍指offer16

一拳一個哇哦怪發表於2020-12-24

劍指 Offer 16. 數值的整數次方

對於這個問題,首先考慮:

  1. 底數為 1,指數為任何數結果都為 1;
  2. 指數為 0,底數為任何數時結果都為 1;
  3. 如果指數n為負數呢?可以轉化成底數為原底數的相反數的計算。

另外,需要考慮如何計算整次方。如果讓 n 個底數逐個相乘,複雜度太大。這個時候,可以考慮二分法。

  • n 為奇數, x n = x n / 2 ∗ x n / 2 ∗ x x^n=x^{n/2}*{x^{n/2}}*x xn=xn/2xn/2x;
  • n為偶數, x n = x n / 2 ∗ x n / 2 x^n=x^{n/2}*x^{n/2} xn=xn/2xn/2.

程式碼:

double myPow(double x, int n) {
        
        if(n==0 ||x==1)
        {
            return 1;
        }
       double ans=1;
       long num=n;
       if(num<0)
       {
           num=-num;
           x=1/x;
       }
       while(num)
       {
           if(num&1)
                ans*=x;
            x*=x;
            num>>=1;
       }
        return ans;
    }
  

相關文章