首页 > 编程问答 >使用牛顿法近似整数的 sqrt,ZeroDivisionError

使用牛顿法近似整数的 sqrt,ZeroDivisionError

时间:2024-07-21 00:36:57浏览次数:9  
标签:python

  1. 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。

以下是修复代码的方法:

  1. 处理初始估计值为 0 的情况: 在开始迭代之前检查 estimate 是否为 0。如果为 0,则可以将其设置为 1 或任何其他非零值来避免错误。

  2. 选择更好的初始估计值: 你可以通过使用更好的初始估计值来降低 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 并正确计算平方根。

标签:python
From: 78773301

相关文章

  • 从 python 中的字符串列表中提取 def 定义函数的标签
    我想使用Python中的正常def过程创建函数,并将标签分配给从字符串列表中提取的命名空间。如何实现这一点?这个问题的动机:我正在创建一个与sympy兼容的python函数库,供数学家用于符号计算实验。许多函数需要初始化具有相关标签的多个对象的系统,这些标签分别由用户提供的字......
  • 在 Raspberry Pi 4 上使用 Python 从具有 SPI 连接的 MT6816 磁性编码器读取
    我对这个领域完全陌生,并不真正知道自己在做什么并且需要帮助。我正在尝试使用MT681614位磁性编码器通过RaspberryPi的SPI连接读取绝对角度。我有以下问题:在硬件方面,是否只是简单地连接必要的连接(3.3V、MOSI、MISO、SCK、GND、CE01)?对于编码......
  • PythonW 不运行脚本。严重地
    因此,使用Windows10和Python3.6。我创建了一个.py脚本,它可以使用命令pythonmyscript.py在命令提示符下正常运行,但是当我制作该脚本的精确副本并为其赋予扩展名.pyw,并尝试使用pythonw运行它时命令pythonwmyscript.pyw,什么也没有发生......
  • 如何使用Python和Selenium模拟产品购买以获取库存信息
    我正在开发一项网络抓取服务,主要针对时尚行业。我的目标是提供有关产品的全面数据,包括库存水平。为了实现这一目标,我需要模拟购买以确定每种尺寸的产品的最大可用数量。我一直在使用Python和Selenium进行网络抓取部分,但在准确模拟购买方面面临着挑战检索股票信息的过程。......
  • 连接Python套接字的问题
    当我写“关闭”时,我试图让我的电报机器人关闭计算机。我不想将机器人连接到网站上的托管。我选择我的手机(AndroidRedmiNote10)作为托管。我在上面安装了Termux和Pydroid。我写了两个文件:main到我的电脑,client到我的手机。通过在计算机上运行这两个文件,一切正常。但是,当我在......
  • 如何修复导入 Numexpr Python 时的错误
    在Windows10Python3.7.9(IDLE)上,我成功安装了“pipinstallnumexpr”,但在“importnumexprasne”时出现错误:Traceback(最近一次调用):文件“<pyshell#21>”,第267行,位于将numexpr导入为ne文件“C:\Python379\lib\site-packages\numexpr_init_.py”......
  • 让 cpython 优化恒定条件
    我正在用Python编写需要尽可能高效运行的代码,但有时我需要深入挖掘调试语句。不要注释这些输入或输出(或者使用外部预处理器来处理代码,就像这里建议的那样Python相当于#ifdefDEBUG或这里如何在python中实现“#ifdef”?|||)我想在模块的开头定义一个变量......
  • 如何使用 for 循环在 python jupyter 笔记本中创建动态图?
    我正在学习本课关于用Python求解热方程。该课程指出,在求解热方程后,我们可以通过在循环中简单地调用pyplot.plot()来可视化解的动画图,其中下面的代码将动态绘制每次每个点的温度,从而得到一个动画情节(课程帖子中提供了动画情节的示例)。importnumpyfrommatplotlibi......
  • Python:动态爱心代码
    importrandomfrommathimportsin,cos,pi,logfromtkinterimport*CANVAS_WIDTH=640CANVAS_HEIGHT=480CANVAS_CENTER_X=CANVAS_WIDTH/2CANVAS_CENTER_Y=CANVAS_HEIGHT/2IMAGE_ENLARGE=11HEART_COLOR="#FF99CC"defcenter_......
  • 如何在 PYTHON 中查找输入数字的千位、百位、十位和个位中的数字?例如:256 有 6 个一、5
    num=int(input("Pleasegivemeanumber:"))print(num)thou=int((num//1000))print(thou)hun=int((num//100))print(hun)ten=int((num//10))print(ten)one=int((num//1))print(one)我尝试过这个,但它不起作用,我被困住了。代码几乎是正确的,但需......