测试代码的网页在这里: https://leetcode.com/problems/sqrtx/description/
我交了这些代码并通过了:
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x==1:
return 1
lowest=0.0
uppest=x*1.0
count=1
middle=(lowest+uppest)*0.5
while (abs(middle*middle-x)>0.001) and (count<=10000):
if middle*middle>x:
uppest=middle
else:
lowest=middle
middle=(lowest+uppest)*0.5
count=count+1
return int(middle)
但当我改变
while (abs(middle*middle-x)>0.001) and (count<=10000):
进入
while (abs(middle*middle-x)>0.0001) and (count<=10000):
或添加更多'0',如0.00000000001,并使用'9'作为输入进行测试,会出错 输出应该是3,但是我得到了2
如何在使用二分法时解决此类问题? 我不想使用库(我知道使用库是最简单的方法,但我想了解更多)
请您参考如下方法:
与其说是python,不如说是一道数学题,直接插入
print(middle,middle**2>x)
用于调试目的。
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x==1:
return 1
lowest=0.0
uppest=x*1.0
count=1
middle=(lowest+uppest)*0.5
while (abs(middle*middle-x)>0.0001) and (count<=10000):
if middle*middle>x:
uppest=middle
else:
lowest=middle
middle=(lowest+uppest)*0.5
count=count+1
print(middle,middle**2>x)
return int(middle)
sol=Solution()
print(sol.mySqrt(9))
输出
2.25 False
3.375 True
2.8125 False
3.09375 True
2.953125 False
3.0234375 True
2.98828125 False
3.005859375 True
2.9970703125 False
3.00146484375 True
2.999267578125 False
3.0003662109375 True
2.99981689453125 False
3.000091552734375 True
2.9999542236328125 False
3.0000228881835938 True
2.999988555908203 False
2
你已经可以看出原因了。
另外我想知道为什么你不能直接使用
round(middle)
