【问题标题】:Prime numbers less than or equal to n小于或等于 n 的素数
【发布时间】:2014-10-25 11:00:49
【问题描述】:

声明说:

编写一个函数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的倍数。我怎样才能只输入一个输入,然后是最终结果会正确吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    这个算法叫做Sieve of Eratosthenes

    这是一种简单的算法,用于查找直到 a 的所有素数 指定的整数。它创建于公元前 3 世纪 埃拉托色尼,古希腊数学家。

    为了开发这个算法,我们将经历上述不同的步骤。

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

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

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

    C= [x for x in C if x%firstElement!=0]

    • 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]

    这张图片可视化算法,Source of picture

    【讨论】:

    • 实际上,当我使用era1(49) 运行您的代码时,最后返回的数字是 49,这不是质数。 25 也是如此。
    • 事实上,奇素数的每个平方都会发生这种情况。
    【解决方案2】:

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

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

    您将需要找到另一种方法来完成此操作 - 或许创建一个包含您想要保留的项目的新列表。

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2015-10-24
      • 2020-12-18
      • 1970-01-01
      • 2021-06-09
      • 2011-01-25
      • 1970-01-01
      • 2021-11-04
      • 2013-09-02
      相关资源
      最近更新 更多