实现函数 pow(x,n)
,返回 xnx^nxn。
备注:
1、-100.0 < x < 100.0
2、n是一个32位的整数,范围为[−231,231−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、暴力法
根据乘方的定义, xnx^nxn 表示 n 个 x 相乘,那么循环 n 次的乘法即可。
算法复杂度为 O(n)。
2、分治法
根据公式:xn=(xn/2)2x^n = (x^{n/2})^2xn=(xn/2)2,可以将问题转化为求 xn/2x^{n/2}xn/2 的子问题,使用分治法可以解决,分治法的结束条件为 21=22^1=221=2
注意:
- n/2n/2n/2 可能是小数,因此要提前判断 n 的奇偶性。
- n 可能是负数,因此要提前将 n 转为整数,并使用公式xn=1/x−nx^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))