二分法求解平方根和立方根
给定一个正整数 n n n,在不使用python库函数的前提下,求出 n n n的平方根和立方根,结果保留两位小数。
此题可以使用二分法解决,对于一个正整数 n n n,可以设定所求结果的范围,在(left, right)之间,其中,初始left为0,初始right为n。因为 0 ≤ r e s u l t = n ≤ n 0\leq result = \sqrt n \leq n 0≤result=n≤n一定满足。
因此,当无法使用库函数直接开根号时,初始范围的设定一定要将最终的result包含在内。接下来就可以使用二分法来逐渐缩小范围,确定result的值。设置mid为逐步逼近result的最终所求值,则初始mid被设置为0,当
m
i
d
2
−
n
<
0
mid^2-n<0
mid2−n<0时,即
m
i
d
<
n
mid<\sqrt n
mid<n,说明mid小于所要求的值,则将left更新为mid,新的mid的值为:
m
i
d
=
(
l
e
f
t
+
r
i
g
h
t
)
/
2
mid=(left+right)/2
mid=(left+right)/2,当
m
i
d
2
−
n
>
0
mid^2-n>0
mid2−n>0时,即
m
i
d
>
n
mid>\sqrt n
mid>n,说明mid大于所要求的值,则将right更新为mid,新的mid的值为:
m
i
d
=
(
l
e
f
t
+
r
i
g
h
t
)
/
2
mid=(left+right)/2
mid=(left+right)/2,逐步迭代,直至满足以下条件时,停止迭代,返回mid值,即为最终所求的值。
∣
m
i
d
2
−
n
∣
<
1
0
−
7
(1)
|mid^2-n|<10^{-7} \tag{1}
∣mid2−n∣<10−7(1)
代码如下:
# 求一个正整数的平方根
n = int(input())
# 二分法
left, mid, right = 0, 0, n
err = mid**2-n
while abs(err) > 1e-7:
if err > 0:
right = mid
else:
left = mid
mid = (left + right)/2
err = mid**2 - n
print(format(mid, '.2f'))
# 求一个正整数的立方根
n = int(input())
left, mid, right = 0, 0, n
err = mid**3 - n
while abs(err) > 1e-7:
if err > 0:
right = mid
else:
left = mid
mid = (left + right) / 2
err = mid ** 3 - n
print(format(mid, '.2f'))