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.求整數次方時,考慮如下的數學公...