Skip to main content
 首页 » 编程设计

python之我关于 Sqrt(x) 的解决方案有什么问题

2025年05月04日21rubylouvre

测试代码的网页在这里: 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)