实现函数 pow(x,n)
,返回
x
n
x^n
xn。
备注:
1、-100.0 < x < 100.0
2、n是一个32位的整数,范围为
[
−
2
31
,
2
31
−
1
]
[−2^{31}, 2^{31} − 1]
[−231,231−1]
示例:
Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
Example 3:
Input: 2.00000, -2
Output: 0.25000
思路
1、暴力法
根据乘方的定义, x n x^n xn 表示 n 个 x 相乘,那么循环 n 次的乘法即可。
算法复杂度为 O(n)。
2、分治法
根据公式: x n = ( x n / 2 ) 2 x^n = (x^{n/2})^2 xn=(xn/2)2,可以将问题转化为求 x n / 2 x^{n/2} xn/2 的子问题,使用分治法可以解决,分治法的结束条件为 2 1 = 2 2^1=2 21=2
注意:
- n / 2 n/2 n/2 可能是小数,因此要提前判断 n 的奇偶性。
- n 可能是负数,因此要提前将 n 转为整数,并使用公式 x n = 1 / x − n x^n = 1/x^{-n} xn=1/x−n
算法复杂度为 O(logn)。
python实现
def myPow(x, n):
"""
:type x: float
:type n: int
:rtype: float
分治法。
"""
def fun(x, n):
'''
递归,x^n = (x^(n/2))^2
'''
# 递归结束条件
if n == 1:
return x
# 递归
half = fun(x, n // 2)
if n % 2 == 1: # 如果是奇数,则还需要再乘以一个x
return half * half * x
else:
return half * half
if n == 0:
return 1
elif n > 0:
return fun(x, n)
else:
return 1/fun(x, -n)
if '__main__' == __name__:
x, n = 2.10000, 3
print(myPow(x, n))