圆中的格点数

时间:2015-09-29 03:12:15

标签: python

我试图确定一个圆中的格点数,即基本上我试图找到对的数量(m,n),使得m ^ 2 + n ^ 2 <= r ^ 2,其中m和n都是整数。我使用下面的代码来做这个,但我得到了r = 12的错误答案,根据this应该是441我得到121而我想知道我可能在哪里错了:

def latticepoints(N):
    num = 0
    for m in range(0, int(N), 1):
        for n in range(0, int(N), 1):
            if (m**2 + n**2) <= N**2:
                num = num + 1

    return number

print(latticepoints(12))

修改

刚刚解决了。只需要将循环更改为:

for m in range(-int(N), int(N)+1, 1):
    for n in range(-int(N), int(N)+1, 1):

由于

1 个答案:

答案 0 :(得分:2)

正如您已经指出的那样,问题是您在圆的一个象限中计算格点。扩大范围以解决这个问题是一种方法;另一种解决方法是采取

lattice points = 4 * (lattice points in a single quadrant) - 3

我们必须减去3,因为第一项计算原点四次。

由于您已经发现了该错误,因此以下是一些关于改进代码的其他方法的快速评论:

  • range()最多可以包含三个参数:start,end和step:

    • 如果仅提供两个参数,则默认步骤为1
    • 如果仅提供一个参数,则默认开始为0并且步骤为1

    一般情况下,你应该提供尽可能少的参数(让默认设置完成剩下的工作) - 这会减少视觉噪音。

    所以在原始函数中,你要写

    for m in range(int(N)):
    

    在固定版本中,你会写:

    for m in range(-int(N), int(N)):
    

  • 由于您的示例将N提供为整数,因此我不确定为什么要继续转换为int()。最好在函数开始时对int()执行单个强制转换,然后删除其余的强制转换。这将减少视觉噪音。

  • 提供的函数抛出NameError。它计算变量num中的格点,但返回number,尚未定义。快速修复是整理return语句;更好的方法是使用更具描述性的变量名称,例如lattice_count

    另请注意,您可以num = num + 1替换num += 1

  • 如果m > sqrt(N)n > sqrt(N),格子点(m,n)显然会落在半径N的圆外。这样,你只需看一下就可以加速你的循环-sqrt(N) <= m <= sqrt(N),同样适用于n