LeetCode 面試題16 數值的整數次方

2022-04-15 07:58:20 字數 2023 閱讀 9195

1、最簡單直觀的方法就是迴圈相乘,但是會超時

2、快速冪(二進位制角度)

對於任意十進位制n,設其二進位制為\(b_m\)...\(b_2b_1\),則有

根據上面的推導,可以把\(x^n\)的計算,轉化為

3、快速冪(遞迴二分)

4、快速冪(非遞迴二分)

非遞迴形式同二進位制形式原理相同,以\(x^=x\cdot x^4 \cdot x^8 \cdot x^\)為例,x一直在累積平方,遇到奇數則將當前的x乘到結果上。

\(\begin

x^ =&\ (x^2)^\ \ \ \ * \ \ \ \ x \ \ \ \ \ \ \ \ 1 \\

(x^2)^ =&\ (x^4)^\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \\

(x^4)^ =&\ (x^8)^9\ \ \ \ \ * \ \ \ \ x^4 \ \ \ \ \ \ \ 0 \\

(x^8)^9 =&\ (x^)^4\ \ \ \ * \ \ \ \ x^8 \ \ \ \ \ \ 1 \\

(x^)^4 =&\ (x^)^2\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \\

(x^)^2 =&\ (x^)^1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \\

(x^)^1 =&\ (x^)^0\ \ \ * \ \ \ \ x^\ \ \ \ 1

\end

\)python

class solution(object):

def mypow(self, x, n):

""":type x: float

:type n: int

:rtype: float

"""# 暴力迴圈求解 291/304 超時

# t = abs(n)

# result = 1.0

# while t:

# result *= x

# t -= 1

# if n < 0:

# return 1.0 / result

# else:

# return result

# # 快速冪(二進位制)

# t = abs(n)

# result = 1.0

# while t:

# if t & 1:

# result *= x

# x *= x

# t >>= 1

# if n < 0:

# return 1.0 / result

# else:

# return result

# # 快速冪(遞迴二分)

# if n == 0:

# return 1.0

# if n < 0:

# return 1.0 / self.mypow(x, -n)

# if n & 1:

# return x * self.mypow(x, n-1)

# return self.mypow(x * x, n // 2)

# 快速冪(非遞迴二分, 同二進位制思想一致)

result = 1.0

t = abs(n)

while t:

if t % 2:

result *= x

x *= x

t //= 2

if n < 0:

return 1.0 / result

else:

return result

面試題16 數值的整數次方

實現函式double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。分析 由於不需要考慮大數問題,這道題看起來很簡單。但是需要特別注意的是 如果輸入的指數小於1 0和負數 的時候怎麼辦?當底數是0且指數是負數的...

面試題16 數值的整數次方

題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。注意幾種特殊的輸入情況,base為0,以及exponent正負時求指數的差異。方法一 class solution else 改進版 class solution unsigned...

面試題16 數值的整數次方

一 題目 實現函式double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。二 關鍵 1.考慮齊全。指數是負數。底數為零且指數是負數的時候。底數是0.2.速度提高。三 解釋 1.求整數次方時,考慮如下的數學公...