素数小于或等于n

时间:2014-10-25 11:00:50

标签: python

声明说:

  

编写一个函数era1(),然后向用户询问数字n   使用此算法打印小于或等于的所有素数   n

     

算法:

     
      
  • 编写一个列表,其中包含从2到您想要计算的最大整数N的数字。
  •   
  • 列表中的第一个数字是素数。将此数字写为素数列表B
  •   
  • 从列表A中删除第一个元素及其倍数。
  •   
  • 如果列表A中的第一个数字小于平方根N,请返回第二个点。
  •   
  • B列表中的数字和列表A中的数字都是搜索过的素数。
  •   

现在,我把这段代码:

import math

def primo(num):
    if num < 2:
        return False

    i = 2
    for i in range(2, int(math.sqrt(num) + 1)):
        if (num % i == 0):
            return False

    return True

def main():
    n = input("Introdueix un nombre: ")
    B = range(2, n)
    for i in B:
        if primo(i):
            print i        

main()

def era1():
    n = input("Introdueix un nombre: ")
    A = range(2, n + 1)
    B = [A[0]]

    for i in A:
        if i % 2 == 0:
            A.remove(i)

    if A[0] < math.sqrt(n):
        print B + A

era1()

结果不正确,因为如果我删除其中一个输入,则出现错误,我只需要输入一次。结果也是错误的,因为A + B,列表B不是函数main的列表,最终结果只是数字不是2和2的倍数。我怎样才能只输入一个输入那么最后的结果会是正确的吗?

2 个答案:

答案 0 :(得分:2)

此算法称为Sieve of Eratosthenes

  

这是一个简单的算法,用于查找最多a的所有素数   指定的整数。它创建于公元前3世纪   Eratosthenes,古希腊数学家。

为了开发此算法,我们将完成上述不同的步骤。

  • 首先,我们生成一个列表,其中包含您想要计算的从2到最大整数N的数字。
A = range(2, n + 1)
  • 我们使用另一个列表C,因为我们稍后可能会使用A来打印初始列表。

  • 我们通过C处理所有小于平方根N的数字。

  • 我们初始化一个空列表B,每次添加一个素数(这是列表的第一个元素)。
  • 我们使用列表理解来过滤乘法:(x%firstElement!=0)
  

如果x%firstElement!= 0,则C = [x代表C中的x]

  • B是其余数字的联合(素数大于平方根N),以及我们检测到的素数。

您的代码应如下所示:

def era1():
    n = input("Introduce a nombre: ")
    #n=120 #To test the
    A = range(2, n + 1) 
    B, C= [],A
    while C[0]< math.sqrt(n): #Condition
        firstElement= C[0]
        B+= [firstElement] #The first number in the list is a prime number. Write this number a list of primes, B.
        C= [x for x in C if x%firstElement!=0] #We use comprehension List to filter multiplies using
    return B+C #The numbers in the B list and those left in List A are all primes searched.

print era1()

n = 120时的输出:[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67, 71,73,79,83,89,97,101,103,107,109,113]

enter image description here

此图片可视化算法Source of picture

答案 1 :(得分:0)

在迭代它时从列表中删除项目会产生意外结果,它会干扰索引。

a = [1,2,3,4,5,6,7,8,9]
for thing in a:
    a.remove(thing)


>>> a
[2, 4, 6, 8]
>>> 

您需要找到另一种方法来实现这一目标 - 或许创建一个包含您想要保留的项目的新列表。