【问题标题】:Debugging a Python Prime Number Program调试 Python 质数程序
【发布时间】:2016-07-25 12:06:17
【问题描述】:

我为 Python 素数生成器编写了代码,用于生成前 100 个素数。但是,不知何故,我的输出中出现了 22、25 等非素数。我已经一遍又一遍地重新检查了几个小时,仍然无法弄清楚我哪里出错了......请帮忙!

这是我的代码:

from math import sqrt

y=[2]
x=3

while len(y)!=100:
   for i in range (2,int(round(sqrt(x)+1))):
     if x%i==0:
        x=x+1

     else:
        y.append(x)
        x=x+1
        break

print(y)

【问题讨论】:

标签: python debugging


【解决方案1】:

我会这样做的;更 Pythonic:

y = [2]
x = 3
while len(y) < 100:
    if all(x % i != 0 for i in range(2, int(round(sqrt(x) + 1)))):
        y.append(x)
    x = x + 1

print(y)

all() 函数非常有用。

这与您所做的更相似;请注意break 声明及其作用:

from math import sqrt

y=[2]
x=3

while len(y) != 100:
    is_prime = True
    for i in range (2, int(round(sqrt(x) + 1))):
        if x % i == 0:
            x += 1
            is_prime = False
            break # this means that x is not prime and we can move on, note that break breaks only the for loop
    if is_prime:
        y.append(x)
        x += 1

print(y)

【讨论】:

【解决方案2】:

其他答案是正确的,但没有一个表明您实际上可以在for 循环中使用else 子句。阅读有关此here 的更多信息。所以你不需要if is_prime: 语句。生成的代码可能如下所示。

 from math import sqrt

 y = [2]
 x = 3

 while len(y) != 100:
    for i in range (2, int(round(sqrt(x) + 1))):
        if x % i == 0:
            x = x + 1
            break

    else:
        y.append(x)
        x = x + 1
print(y)

提示:x+=1 可以替换 x=x+1

此外,作为@user2346536,您实际上可以使用更有效的算法来计算质数,这在您循环大数时非常重要。

【讨论】:

  • 加分,因为我只是不知道 elsing for 循环!虽然这绝对让我感到困惑
【解决方案3】:

else 的内容应该在 for 循环之外。在这里,一旦 x 未能被“至少一个 i”分割,而不是“未能被每个 i 分割”,您就将 x 附加到数组中

而且这种算法效率很低。快速尝试一下: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

from math import sqrt

y=[2]
x=3

while len(y)!=100:
    prime = True
    for i in [ i for i in y if i < sqrt(x) + 1 ]:
        if x%i==0:
            prime = False
            break

    if prime:
        y.append(x)

    x=x+1


print(y)

请注意,我已经通过仅除以先前找到的素数来优化您的算法。

【讨论】:

    【解决方案4】:

    正如 user2346536 所说,您的 else 不应该在循环内。你只会看到i = 2的元素

    怎么做:

    from math import sqrt, ceil
    prime_list = [2]
    x = 2
    while prime_list != 100:
        x += 1
        is_prime = True
        for element in range(2,int(ceil(sqrt(x)))):
            # if x is divided, then we go to next iteration
            if x%element == 0:
                is_prime = False
                break
        if is_prime:
            y.append(x)
    

    【讨论】:

      【解决方案5】:

      您对素数的测试是错误的。您检查一个数字是否可以被 i 从 2 整除到 sqrt(x) 整除,这是正确的,但是一旦您遇到一个不是因素的数字,您就会认为该数字是素数,这是不正确的。您必须检查所有数字,如果没有一个是因数,那么您可以得出结论,您的数字是素数:

      from math import sqrt
      
      y=[2]
      x=3
      
      while len(y)!=100:
          isPrime=True
          for i in range (2,int(round(sqrt(x)+1))):
              if x%i==0:
                  x=x+1
                  isPrime=False
                  break             # See Mr Nun's answer
          if(isPrime):
              y.append(x)
              x=x+1
      
      print(y)
      

      正如所指出的,这不是一个非常有效的解决方案。查看@user2346536 答案中的链接。

      【讨论】:

        【解决方案6】:

        使用埃拉托色尼筛法求素数

        # Find Prime Numbers using Sieve of Eratosthenes rule
        listPrime = []  #create a list and add 1 to 100 nunbers
        for i in range (1, 101):
            listPrime.append (i)
        print("The Numbers are: " + str(listPrime))
        
        for i in range (2, 101):
            for j in range (i, 101): 
                z = i * j
                if (z > 100):
                    break
                else:
                    if z in listPrime:
                        listPrime.remove(z)
        
        print ("The Prime Numbers are: " + str(listPrime))
        

        【讨论】:

          【解决方案7】:

          打印前一百个素数的代码:

          def prime_hundred():
              prime = [2]
              num = 3
              while len(prime) < 100:
                  for i in range(2, num):
                      if num % i == 0:
                          break
                  else:
                      prime.append(num)
                  num += 1
              return prime
          
          
          print(prime_hundred())
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-03
            • 1970-01-01
            • 2015-06-07
            • 2010-09-21
            • 2020-08-27
            相关资源
            最近更新 更多