【问题标题】:What's the issue with this 1000th prime number code? [duplicate]这个第 1000 个素数代码有什么问题? [复制]
【发布时间】:2017-12-09 20:25:56
【问题描述】:
count=5 #Nth prime number
i=10  #number to be checked
while (count!=1000):  #until its not 1000th
 if i%2==0 or i%3==0 or i%5==0 or i%7==0:  #to check non prime
  i=i+1 #next number initialized
 else: #for prime
  count=count+1 #move to next position
if count==1000: #if is 1000th position 
 print i," is 1000th prime." #print prime

我正在考虑 2,3,5,7 已经被称为素数并且从 10 开始。

它给出“11 是第 1000 个素数”作为输出。 我猜某处存在逻辑错误。

【问题讨论】:

  • 我认为你应该告诉我们这有什么问题
  • 您应该解释为什么您认为存在问题。
  • 您将任何不能被 2、3、5 或 7 整除的数都算作质数,但是有许多非质数不能被其中任何一个整除。您需要检查目前发现的所有素数。
  • 嗯,是的。没有人说寻找素数是一个计算成本低的问题。
  • 想想我 11 岁时循环内部会发生什么。它怎么会到 12 岁?

标签: python python-2.7


【解决方案1】:

正如其他人在 cmets 中提到的那样,您判断一个数是否为素数的标准是非常错误的。您只是在测试它是否可以被前 4 个素数整除,但这对于大于 120 的数字是不够的(121 可以被 11 整除,但不能被任何较小的素数整除)。您需要检查之前找到的所有素数(查找“埃拉托色尼筛法”)。

另一个问题是当数字为素数时,您没有增加i。所以一旦你到达11,你会继续增加count,而不是i。当count 变为1000 时,您将i 打印为第1,000 个素数。将i = i + 1if块中取出,每次都应该这样做。

此外,由于偶数永远不能是素数(2 除外),您可以从 i = 11 开始并将其递增 2 - 不要浪费时间检查偶数。然后你可以将i % 2 == 0 退出测试。

【讨论】:

  • 另外,检查所有数字直到我可以工作而不是存储所有素数?
  • @user8262214 这会起作用,但对于非常大的数字来说效率极低。
  • 您只需要检查小于sqrt(i)的数字。
  • 好的!谢谢!
【解决方案2】:
  1. 您编写的计算素数的逻辑是错误的。我认为您可以存储您在先前测试中计算的所有质数,然后通过除以所有先前的质数来测试下一个数字,或者仅根据质数的定义来测试下一个数字
  2. 在循环中,如果 i == 11,那么您将增加计数器,但是,i 不会增加,因此对于后续循环,您只需测试 11 是否为质数。这就是为什么将 11 打印为第 1000 个数字的原因。实际上,您将打印 11 作为第 N 个素数。我认为您应该始终增加i

【讨论】:

    【解决方案3】:

    143 是 11*13 所以它不是素数。 您的代码会将其视为素数,因为您只检查它是否可以除以前 5 个素数。 为了解决你的疑问,我只是乘以素数 11 和 13。 希望能帮助到你。

    顺便说一句,您的代码也是错误的,因为它只会在匹配条件时增加“i”,所以当它总是检查时: 如果 11%2==0 或 11%3==0 或 11%5==0 或 11%7==0:

    您的代码的解决方案(不计算第 1000 个素数):

    count=5 #Nth prime number
    i=10  #number to be checked
    while (count!=1000):  #until its not 1000th
        if i%2==0 or i%3==0 or i%5==0 or i%7==0:  #to check non prime
            pass #next number initialized
        else: #for prime
            count=count+1 #move to next position
        i=i+1
    if count==1000: #if is 1000th position 
        print i-1," is 1000th prime." #print prime
    

    您的问题的解决方案:

    def is_prime(n):
      if n == 2 or n == 3: return True
      if n < 2 or n%2 == 0: return False
      if n < 9: return True
      if n%3 == 0: return False
      r = int(n**0.5)
      f = 5
      while f <= r:
        if n%f == 0: return False
        if n%(f+2) == 0: return False
        f +=6
      return True
    
    count=5 #Nth prime number
    i=10  #number to be checked
    while (count!=8):  #until its not 1000th
        if not is_prime(i):  #to check non prime
            pass #next number initialized
        else: #for prime
            count=count+1 #move to next position
        i=i+1
    if count==8: #if is 1000th position
        print i-1," is 1000th prime." #print prime
    

    函数 is_prime(n) 来自isPrime Function for Python Language

    【讨论】:

    • 这还不够,因为那样你就无法捕捉到 17*19 - 等等。这里没有可硬编码的解决方法。
    • 这并不能解释为什么它说11 是第 1000 个素数。
    • 即使有这个错误,11 也只是第 5 个素数。它应该打印一些大的非素数作为第 1000 个素数,而不是 11。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2012-08-07
    • 2014-08-29
    • 2013-06-05
    • 2014-06-04
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多