【问题标题】:First 100 prime numbers前 100 个素数
【发布时间】:2015-10-08 04:11:58
【问题描述】:

我知道有很多方法可以找到前 100 个素数,但请帮助我的方法。我发现count 的值正在增加,但由于某种原因while 循环条件不适用:

count = 0

while(count <= 20):
    for i in range(2, 20):
        for j in range(2, i):
            if i < j:
                print("The number",i,"is prime")
            elif i % j == 0:
                break
        else:
            print("The number",i,"is prime")
            count = count + 1
            print(count)

【问题讨论】:

  • 如果您使用 3.x 作为标签指示,__future__ 导入是多余的。
  • 还有while(count &lt;= 20):一般写成while count &lt;= 20:
  • @JonSurrell:如果问题使现有答案无效,请不要更改问题。

标签: python primes


【解决方案1】:

您可以使用Sieve of Eratosthenes 找到第一个n 素数:

def primes_upto(limit):
    prime = [True] * limit
    for n in range(2, limit):
        if prime[n]:
            yield n # n is a prime
            for c in range(n*n, limit, n):
                prime[c] = False # mark composites

要获得前 100 个素数:

>>> list(primes_upto(542))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, ... ,
 499, 503, 509, 521, 523, 541]

要找到第一个 n 质数,您可以使用 estimate n-th prime (to pass the upper bound as the limit) 或使用 an infinite prime number generator 并获得所需数量的数字,例如使用 list(itertools.islice(gen, 100))

【讨论】:

  • OP 正在就他们的代码寻求帮助,而不是寻求改进的主要查找器/生成器。
  • @JonSurrell 它回答了标题中的问题。 95% 以上的访问者来自网络搜索引擎。如果 OP 询问如何编写一个 while 循环;答案会有所不同。
  • 您说得对,title 没有准确反映问题的内容。如果 OP 已经阅读并理解了how to ask,那么标题肯定会有所不同。但是 title 不是 question,我不同意我们应该忽略 OP 提出的问题并回答我们决定标题所说的内容。也许更好的做法是建议和编辑标题。
  • 谢谢乔恩!下次我会正确发布。感谢您的帮助:-)
  • @EspoirMurhabazi 因为小于n*n 且除以n 的复合材料已被较早标记。按照第一个链接查看动画。
【解决方案2】:

如果您正在寻找效率和简单代码的组合,Numpy 值得一试。通过一些花哨的索引,下面的代码完成了实现 Eratosthenes 筛子的工作。

import numpy as np

ns = np.array(range(2,N))
primes = []
last_prime=2
while last_prime:
    primes.append(last_prime)
    ns = ns[ns%last_prime != 0]
    last_prime = ns[0] if len(ns) > 0 else None
print(primes[:100])

然后只需调整 N 直到你有 100 个素数。一个好的第一个猜测是大约 100*log(100) ~ 460(来自素数定理)。这将给出 88 个素数。将 N 增加到 600 的值,您将有足够的素数。

【讨论】:

    【解决方案3】:

    这是一个更简单的代码。我们循环了从 0 到数字的所有数字,直到打印出 100 个素数。

    n=0
    i=0
    while n<100:
        i+=1
        count=1
        for j in range(2,i):
            if i%j==0:
                count=0
                break
        
        if count==1:
            print(i,end=' ')
            n+=1
    
        
    

    【讨论】:

      【解决方案4】:
      prime_count=0
      n=1
      while(True):
          count=0
          i=2
          n+=1
          while(i<=n):
              if(n==i):
                  print(n)
                  prime_count+=1
              elif(n%i==0):
                  break
              i+=1
          if(prime_count==100):
              break
      

      【讨论】:

      • 这段代码真的可以解释一下!
      • A code-only answer is not high quality。虽然此代码可能很有用,但您可以通过说明其工作原理、工作方式、何时应该使用以及它的局限性来改进它。请edit您的回答包括解释和相关文档的链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2011-02-02
      • 2021-03-10
      相关资源
      最近更新 更多