- Sqrt(x)
给定一个非负整数 x,返回 x 的平方根,向下舍入到最接近的整数。返回的整数也应该是非负数。
不得使用任何内置指数函数或运算符。
例如,不要在 c++ 中使用 pow(x, 0.5) 或在 c++ 中使用 x ** 0.5 python.
示例 1:
输入:x = 4 输出:2 解释:4 的平方根是 2,所以我们返回 2。 示例 2:
输入:x = 8 输出:2 解释:8 的平方根是 2.82842...,由于我们将其向下舍入到最接近的整数,因此返回 2。
当 x = 8 时 我预计该函数会返回 2,因为 int(y) 对数字进行舍入,但我在线得到了 ZeroDivisionError (estimate = (1/2)*(estimate+(x/estimate))。这是一个简单的 leetcode 问题#69 sqrt(x)
这是我在 leetcode 上运行的代码:
def mySqrt(self, x):
estimate= 1 + ((x-1)//2)
difference = abs(x-(estimate*estimate))
tolerance = .005
while difference > tolerance:
estimate = (1/2)*(estimate+(x/estimate))
difference = abs((x-(estimate*estimate)))
return int(estimate)`
Runtime Error
ZeroDivisionError: integer division or modulo by zero
estimate = (1/2)*(estimate+(x/estimate))
Line 8 in mySqrt (Solution.py)
ret = Solution().mySqrt(param_1)
Line 29 in _driver (Solution.py)
_driver()
Line 39 in <module> (Solution.py)
在牛顿法中出现
ZeroDivisionError
的原因是你的初始估计值
estimate
有可能变成 0,然后在
estimate = (1/2)*(estimate+(x/estimate))
中导致除以 0。
以下是修复代码的方法:
-
处理初始估计值为 0 的情况: 在开始迭代之前检查
estimate
是否为 0。如果为 0,则可以将其设置为 1 或任何其他非零值来避免错误。 -
选择更好的初始估计值: 你可以通过使用更好的初始估计值来降低
estimate
变为 0 的可能性。与其使用estimate= 1 + ((x-1)//2)
,不如简单地使用estimate = x
或estimate = x // 2
(对于 x > 1)。这将使初始估计值更接近实际平方根,并减少迭代次数。
这是一个包含上述更改的更新后的代码:
def mySqrt(self, x):
if x == 0:
return 0
estimate = x
tolerance = 0.005
while abs(x - estimate * estimate) > tolerance:
estimate = (1/2) * (estimate + (x/estimate))
return int(estimate)
这段代码首先检查 x 是否为 0。如果是,则返回 0。否则,它会将 x 作为初始估计值,并执行牛顿法迭代,直到误差低于容差值为止。最后,它返回向下舍入到最接近整数的估计值。
这个经过修改的代码应该可以解决
ZeroDivisionError
并正确计算平方根。