50 - Pow(x, n) - python

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

示例 1:

輸入: 2.00000, 10
輸出: 1024.00000

示例 2:

輸入: 2.10000, 3
輸出: 9.26100

示例 3:

輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25

說明:

  • -100.0 < x < 100.0
  • n 是 32位有符號整數,其數值範圍是 [−231, 231 − 1] 。

題目要求xnx^n,而且說明n[231,2311]n \in [-231, 231-1],因此不能使用python內置的方法求解,雖然以下代碼可以AC。

class Solution:
    def myPow(self, x: float, n: int) -> float:
        return x ** n

用題目給出的示例中可以知道,nn有正有負:

  • 如果nn爲正數,xn=xnx^n = x^n
  • 如果nn爲負數,xn=1xnx^n = \frac{1}{x}^{-n}

如果nn爲偶數,例如:28=44=162=2561=2562^8 = 4^4 = 16^2 = 256^1 = 25628=128=144=1162=125612^{-8} = \frac{1}{2}^{8} = \frac{1}{4}^{4} = \frac{1}{16}^{2} = \frac{1}{256}^{1}

如果nn爲奇數,需使用輔助變量儲存每次xx乘方運算時少算的xx

class Solution:
    def myPow(self, x: float, n: int) -> float:
        # 二分法
        if x == 0: return 0

        if n < 0:
            x = 1 / x
            n = -n

        rest = 1
        while n >= 1:
            # 判斷指數除以2後是否爲奇數
            if n % 2 == 1:
                rest *= x
            # x乘方 
            x *= x
            # 指數除以2
            n //= 2

        return rest

遞歸法

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if n<0:
            n = -n
            return 1 / self.help_(x,n)
        return self.help_(x,n)

    def help_(self,x,n):
        if n == 0:
            return 1
        if n % 2 == 0:  #如果是偶數
            return self.help_(x*x, n // 2)
        # 如果是奇數
        return self.help_(x*x,(n - 1) // 2) * x
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章