这是一个学术练习。我在Python中实现了sqrt函数。这是我的代码,
def mySqrt(x):
low, high = 1, x
while low < high:
mid = low + (high - low)/2
if mid * mid > x:
high = mid - 1
elif mid * mid < x:
low = mid
else:
return mid
return low
问题在于,当数字不是完美的正方形时,这不起作用。 我想重新设计这个函数仍然使用log n复杂度,它将sqrt的值返回到指定的小数位数。 所以它就像是,
def sqrt(num, param):
pass
从而
sqrt(5, 2) = 2.41
sqrt(5, 3) = 2.414
有人可以帮我解决这个问题。感谢。
答案 0 :(得分:6)
您可以使用Babylonian method。
def sqrt(x):
n = 1
for _ in range(10):
print(n)
n = (n + x/n) * 0.5
收敛速度非常快。以下是sqrt(2)
的示例:
1
1.5
1.41666666667
1.41421568627
1.41421356237
1.41421356237
1.41421356237
1.41421356237
1.41421356237
1.41421356237
代表sqrt(3)
:
1
2.0
1.75
1.73214285714
1.73205081001
1.73205080757
1.73205080757
1.73205080757
1.73205080757
1.73205080757
现在您只需要用for
和精度条件替换while
循环并返回结果而不是仅打印它。
答案 1 :(得分:2)
您可以尝试Newton's Method查找平方根
#!/usr/bin/env python
def ntsqrt(n):
sgn = 0
if n < 0:
sgn = -1
n = -n
val = n
while True:
last = val
val = (val + n / val) * 0.5
if abs(val - last) < 1e-9:
break
if sgn < 0:
return complex(0, val)
return val
if __name__ == "__main__":
print ntsqrt(25.0)
以上打印成功确切的平方根5.0,每次迭代的值如下:
5.00000000005
答案 2 :(得分:0)
def sqrt(num, param):
return float(str(num**0.5)[:param+len(str(num).split("."))+1])
你可以做到1/2的力量