【问题标题】:Python - printing first 1000 primes doesn't stopPython - 打印前 1000 个素数不会停止
【发布时间】:2014-07-25 20:36:19
【问题描述】:

我的最新代码中有一个问题,我完全不知道如何解决。基本上,我打印出前 1000 个素数 - 但我的代码打印出的素数远远超出了前 1000 个素数的限制。我在我的代码中指定在 1000 处停止。这是我的代码:

import itertools

counter = 1

while (counter <= 1000):
    for i in itertools.count(start=3, step=1):
        for a in range(2, i/2):
            if (i % a == 0):
                break
        else:
            print i
            counter += 1

我真的不知道如何解决这个问题。有人可以帮忙吗?

解决方案

我通过在 else 块中添加这段代码来修复此代码:

if (counter == 1000):
    sys.exit()

【问题讨论】:

  • 您的 break 语句只破坏了 for a in range(2, i/2) 循环,而不是它上面的循环。所以for i in itertools.count(start=3, step=1) 循环继续进行。
  • @BradBeattie 这是设计使然,这是正确的。问题是他们需要第二个break 才能摆脱更大的循环。
  • 感谢 unutbu - 会这样做的

标签: python for-loop primes


【解决方案1】:

Count 永远不会停止生成数字,所以基本上你被困在for 循环中。

一个快速的解决方法是:

import itertools

counter = 1

for i in itertools.count(start=3, step=1):
    for a in range(2, i/2):
        if (i % a == 0):
            break
    else:
        print i
        counter += 1
        if counter > 1000:
             break

【讨论】:

    【解决方案2】:

    您收到了很多关于为什么您的答案不起作用的回复。这就是我的做法!我宁愿构建一个素数生成器并从中提取。

    class PrimeNumberGen(object):
        def __init__(self,max_prime=None):
            if max_prime:
                self.numbers = range(2, max_prime+1)
            else:
                self.numbers = itertools.count(start=2, step=1)
        def __next__(self):
            for num in self.numbers:
                for divisor in range(2, int(num**0.5)+1):
                    if num % divisor == 0:
                        break
                else:
                    return num
    
    primes = PrimeNumberGen()
    for _ in range(1000):
        print(next(prime))
    

    【讨论】:

      【解决方案3】:

      您的版本卡在内部循环中。

      import itertools
      
       counter = 1
      
       for i in itertools.count(start=3, step=1):
          if(counter<1000):
              for a in range(2, i/2):
                  if (i % a == 0):
                      break
              else:
                  print i
                  counter += 1
          else:
             break
      

      【讨论】:

        【解决方案4】:

        你需要在所有循环之外初始化你的计数器,你编写它的方式是每次都在你的 while 中重置它:

        counter = 0
        nums = itertools.count(start=3, step=1)
        
        while counter <= 1000:
           i = next(nums)
           for a in range(2, i/2):
                if i % a == 0:
                    break
           else:
               print(i)
               counter += 1
        

        【讨论】:

          【解决方案5】:

          即使使用您的解决方案,您的代码也会打印 999 个素数而不是 1000。(最后一个数字应该是 7919 而不是 7907)https://primes.utm.edu/lists/small/1000.txt

          您的代码中唯一的问题是,

          counter = 0 #instead of counter = 1

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-11
            • 1970-01-01
            • 2020-09-30
            • 2016-02-16
            • 2019-11-30
            • 1970-01-01
            • 2016-10-20
            • 2020-02-26
            相关资源
            最近更新 更多