Prime数字打印机停在251,为什么?

Fop*_*art 33 python

我今天开始学习Python,我想出了创建一个程序,打印从0到10 000的所有素数的想法.我设法让我的程序打印出所有质数,直到251,此时它停止打印出数字.为什么这样做?

这是代码:

for numberToCheck in range(2,10000):
    divider = 2
    while numberToCheck > divider:
        if numberToCheck % divider is 0:
            break
        else:
            divider += 1
    if numberToCheck is divider:
        print(numberToCheck, "is a prime number.")
Run Code Online (Sandbox Code Playgroud)

Bak*_*riu 74

问题是你使用的是is代替==.在is操作执行对象的身份对比,其中"恰好工作"下面所有的数字256,由于实施细节.251是256以下的最大素数(在这里检查,下一个素数是257)然后is返回False:

>>> 254 + 1 is 255
True
>>> 255 + 1 is 256
True
>>> 256 + 1 is 257
False
Run Code Online (Sandbox Code Playgroud)

相等运算符是==:

>>> 254 + 1 == 255
True
>>> 255 + 1 == 256
True
>>> 256 + 1 == 257
True
Run Code Online (Sandbox Code Playgroud)

  • 非常好的答案 (3认同)

Aje*_*hah 12

使用==检查数字的平等:

for numberToCheck in range(2,10000):
    divider = 2
    while numberToCheck > divider:
        if numberToCheck % divider is 0:
            break
        else:
            divider += 1
    if numberToCheck == divider:
        print(numberToCheck, "is a prime number.")
Run Code Online (Sandbox Code Playgroud)

Is运算符用于检查id两个对象,同时==操作员检查其值.

Python为-5to 之间的值实现了一个整数Array 256,当你在这个范围内创建一个int对象时,你会获得对现有数组实现的引用.这就是为什么id这个范围内的所有整数对象都是相同的,但对于此范围之外的整数对象则不同,如下所示:

>>> a = -6
>>> b = -6
>>> a is b      # a and b has different id
False

>>> a = -5
>>> b = -5
>>> a is b      # a and b has same id
True

>>> a = 256
>>> b = 256
>>> a is b      # a and b has same id
True

>>> a = 257
>>> b = 257
>>> a is b      # a and b has different id
False
Run Code Online (Sandbox Code Playgroud)

这就是原因,你的程序打印素数直到251但不是下一个素数257,然后你的程序一直运行numberToCheck到达9999.

此外,您可能会考虑使用更快的算法来生成素数,例如Eratosthenes的Sieve.

基本上,你应该检查的可分性numberToCheck所有素数之间2和(以前找到的黄金或平方根 numberToCheck,以较少者为准).


Dan*_*iel 2

You must not compare numbers with is. Use always == for equality testing.