繁体   English   中英

质数小于或等于n

[英]Prime numbers less than or equal to n

声明说:

编写一个函数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的倍数。正确?

该算法称为Eratosthenes筛网

这是一种简单的算法,可查找所有最大为指定整数的质数。 它是由古希腊数学家Eratosthenes在公元前3世纪创建的。

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

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

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

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

C = [如果x%firstElement!= 0,则表示C中x的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]

在此处输入图片说明

该图片可视化算法, 图片来源

在列表上进行迭代时从列表中删除项目将产生意外结果,这会干扰索引编制。

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


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM