【问题标题】:Python Prime number finderPython素数查找器
【发布时间】:2016-08-17 23:50:03
【问题描述】:

我制作了一个质数查找器,您可以在其中输入一个数字,它会告诉您天气它是一个质数。

while True:
    p = int(input('Enter a number '))
    for d in range(2, p):
        if p % d == 0:
            print(p, "is not a prime number!", d,"*", p//d,"=",p)
            break
        else:
            print(p, "is a prime number!")
            break

但是它显示的数字显然不是素数。我认为它只是将它除以 2,因为我尝试过的所有奇数都被输出为奇数。

谁能帮忙解决这个问题?

【问题讨论】:

  • 想一想——你什么时候确定一个数是素数?是在你检查过它是否能被二整除之后吗?
  • 我认为它只是将其除以 2,因为我尝试过的所有奇数都被输出为奇数?
  • 性能方面,可以拍for d in range(2, math.sqrt(p)+1):

标签: python python-3.x math


【解决方案1】:

你必须检查所有的数字才能说它是素数。目前,您的循环在第一次检查时退出(即d == 2),如果p % 2 == 0,则返回False,否则返回True

您应该将else 语句放在循环的末尾,如下所示:

while True:
    p = int(input('Enter a number '))
    for d in range(2, p):
        if p % d == 0:
            print(p, "is not a prime number!", d,"*", p//d,"=",p)
            break
    else:
        print(p, "is a prime number!")

只有当循环没有以break 结束时,才会执行else。这意味着如果没有找到任何分隔符,则您的数字是素数。

此外,请注意,您不必在 p 之前检查数字,您可以在 sqrt(p) 处停止并两个两个地迭代:for d in range(3, int(p**0.5) + 1, 2)

【讨论】:

  • 谢谢你工作得很好,我不太清楚为什么我首先将中断放在代码中。 :)
  • 另外,您不需要检查高达p。就做for d in range(2, p ** 0.5 + 1):
  • @User592 并且您应该测试 2,然后只测试奇数...无需除以 4,6,8,10,... 以获得更多速度/想法,请参阅 Prime numbers by Eratosthenes quicker sequential than concurrently?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2015-02-28
相关资源
最近更新 更多