【问题标题】:Python Prime number list generator errorsPython素数列表生成器错误
【发布时间】:2019-02-19 09:22:13
【问题描述】:

此代码从 5 开始,并列出了您可以选择的以下素数,在本例中为以下 17 个素数。当我运行它时,会打印 25 和 49。为什么没有过滤掉?

start = 5
number = 1
divisor = 3
upper = start - 2
doc = open("hey.txt", "w")
while number <= 17:
    if start % divisor == 0:
        start = start + 2
        divisor = 3
    elif divisor == upper:
        doc.write(str(start))
        doc.write(", ")
        number = number + 1
        start = start + 2
        divisor = 3
    else:
        divisor = divisor + 2


hey.txt: 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49, 53, 

【问题讨论】:

  • 看起来您只过滤掉了 2 或 3 的倍数,例如您还有 35 = 5 * 7。数字越多,您将获得其他更大素数的更多倍数。
  • 是否打算只打印素数?
  • 如果您的意图是生成素数 - 看看Sieve_of_Eratosthenes

标签: python loops primes


【解决方案1】:

你需要更新你的 upper 变量,我会解释:

当您将start 数字写入文件时,这意味着您发现此数字是质数,因此您需要将upper 变量更新为新的start -2 值,因为您增加了start。所以你的函数应该是这样的:

start = 5
number = 1
divisor = 3
upper = start - 2
doc = open("hey.txt", "w")
while number <= 17:
    if start % divisor == 0:
        start = start + 2
        divisor = 3
    elif divisor == upper:
        doc.write(str(start))
        doc.write(", ")
        number = number + 1
        start = start + 2
        divisor = 3
        upper = start - 2 # this is the line you forgot.
    else:
        divisor = divisor + 2

【讨论】:

    【解决方案2】:

    可能是因为你没有增加鞋面。所以你测试的最大除数是 3。

    【讨论】:

      【解决方案3】:

      你的问题已经得到了答案。但是看看这个问题。这是一种更快的方法来做素数Fast primes with python

      def primes2(n):
          """ Input n>=6, Returns a list of primes, 2 <= p < n """
          n, correction = n-n%6+6, 2-(n%6>1)
          sieve = [True] * (n//3)
          for i in range(1,int(n**0.5)//3+1):
            if sieve[i]:
              k=3*i+1|1
              sieve[      k*k//3      ::2*k] = [False] * ((n//6-k*k//6-1)//k+1)
              sieve[k*(k-2*(i&1)+4)//3::2*k] = [False] * ((n//6-k*(k-2*(i&1)+4)//6-1)//k+1)
          return [2,3] + [3*i+1|1 for i in range(1,n//3-correction) if sieve[i]]
      

      确实,它不是真正可读的。但首先要看看其他人是否已经做了你想做的事。 Python 是一种拥有庞大社区的语言,它的好处是大量的库和大量开发的算法/程序,它们可能以比你自己做的更干净、更快的方式做你想做的事情。所以享受社区的好处。)

      【讨论】:

        【解决方案4】:

        更简洁更短:

        lower = 5
        upper = 50
        
        print("Prime numbers between {} and {} are: ".format(lower, upper))
        
        doc = open("hey.txt", "w")
        for num in range(lower,upper + 1):
           # prime numbers are greater than 1
           if num > 1:
               for i in range(2,num):
                   if (num % i) == 0:
                       break
               else:
                   print(num)
                   doc.write(str(num))
                   doc.write(",")
        

        输出:

        Prime numbers between 5 and 50 are: 
        5,7,11,13,17,19,23,29,31,37,41,43,47,
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-26
          • 1970-01-01
          • 2013-03-20
          • 2014-06-10
          • 2019-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多