1 问题
实现函数 double Power(double base, int exponent),求base的exponent次方。
注意:
1.保证base和exponent不同时为0。
2.不得使用库函数,同时不需要考虑大数问题
3.有特殊判题,不用考虑小数点后面0的位数。
数据范围:
∣
\mid
∣ base
∣
≤
100
|\leq 100
∣≤100,
∣
e
x
p
o
n
e
n
t
∣
≤
100
| exponent \mid \leq 100
∣exponent∣≤100 ,保证最终结果一定满足
∣
v
a
l
∣
≤
1
0
4
|v a l| \leq 10^4
∣val∣≤104
进阶:空间复杂度 O(1) ,时间复杂度 O(n)
示例1
输入:2.00000,3
返回值:8.00000
示例2
输入:2.10000,3
返回值:9.26100
示例3
输入:2.00000,-2
返回值:0.25000
说明:2的-2次方等于1/4=0.25
2 答案
自己写的,比较傻瓜
class Solution:
def Power(self , base: float, exponent: int) -> float:
if exponent == 0:
return 1
is_zheng = True
res = 1
if exponent < 0:
is_zheng = False
for _ in range(abs(exponent)):
res *= base
return res if is_zheng else 1/res
官方解
- 直接运算
- step 1:先处理次方数为负数的情况,将底数化为分数解决。
- step 2:遍历次方数的次数,不断累乘底数。
class Solution:
def Power(self , base: float, exponent: int) -> float:
#处理负数次方
if exponent < 0:
base = 1 / base
exponent = -exponent
res = 1.0
#累乘
for i in range(exponent):
res *= base
return res
- 快速幂
分治:即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进行处理。经过分治后的子问题,需要将解进行合并才能得到原问题的解,因此整个分治过程经常用递归来实现。
- step 1:先处理次方数为负数的情况,将底数化为分数解决。
- step 2:使用快速幂计算次方:将已乘出来的部分求次方,可以每次缩小一半要求的次方数。
class Solution:
# 快速幂
def Pow(self, x: float, y: int) -> float:
res = 1
while y:
if y & 1:
res *= x
x *= x
y >>= 1
return res
def Power(self, base: float, exponent: int) -> float:
# 处理负数次方
if exponent < 0:
exponent = -exponent
base = 1/base
return self.Pow(base, exponent)
https://www.nowcoder.com/share/jump/9318638301698414504035