牛客华为HJ107求解立方根

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 这个二分法问题,需要明确几点:
# 第一: 题目说了精度 在小数点后一位,3次方后,要求误差 在 0.001以内。
# 第二: 二分法的起点和终点的问题:
# 如果 a**3 在 0-1 之间的话,我们要求的 a 就一定在 0-1 之间,并且 下限是 a**3 因为a 会越乘越小(当然,理论上设置0应该也行),上限是 1 因为0.999最大的乘积也只能逼近1 ;a**3 > 1 的话,我们要求的 a 就一定在 1-a**3 之间,下限是1 上限是a**3 ,最后二分法往上逼近到a附近,满足误差即可。
# 同理,负数情况,a**3 属于【-1,0】之间,下限在-1 上限在a**3; a**3 < -1,则 下限在 a**3,上限在 -1。
# 这里二分法的 左右指针移动 就不在 mid + 1 -1 了,而是直接用mid 代替,只要最后 误差在精度要求内即可,注意这个误差应该用绝对值确定。
aaa = float(input())
def find_num(aaa):
left,right = 0,0
if aaa>=1:
left,right = 1,aaa
elif aaa>0 and aaa<1:
left,right = 0,1
elif aaa<=-1:
left,right = aaa,1
elif aaa>-1 and aaa<0:
left,right = -1,0
mid = (left+right)/2
while abs(mid**3-aaa) > 0.001:
if mid**3 > aaa:
right = mid
elif mid**3 < aaa:
left = mid
else:
return mid
mid = (left+right)/2
return mid
result = find_num(aaa)
print("%.1f"%result)