蓝桥杯-质数-埃氏筛(python)

1.题目

蓝桥杯-质数-埃氏筛(python)_第1张图片

2.代码

import os
import sys

# 请在此输入您的代码
def countPrimes(n):
  primes=[1]*n
  count=0
  li=[]
  for i in range(2,n):
    if primes[i]:
        count+=1
        li.append(i)
        for j in range(i*i,n,i):
          primes[j]=0
  return count,li
  
n=int(input())
a,b=countPrimes(n)
print(*b)
print(a)

3.埃尔筛

        埃氏筛(Sieve of Eratosthenes)是一种古老的素数筛法,可以用来快速地找出小于等于某个正整数N的所有素数。它的名字来自于古希腊学者埃拉托斯特尼(Eratosthenes)。

        该算法的基本思想是:先用最小的素数2去筛,把2的倍数都标记成合数,然后再用下一个素数去筛,重复这个过程直到所有小于等于N的数都被筛过一遍。最后未被标记的数就是素数。

        具体实现过程可以用一个长度为N的布尔数组来表示每个数字是否为素数,初始时所有元素都被标记为素数,然后从2开始枚举每个素数p,将p的所有倍数都标记为合数(即在布尔数组中标记为false),直到p*p>N为止。最后所有未被标记为合数的元素就是素数。

        埃氏筛法是一种简单高效的算法,时间复杂度为O(NloglogN),空间复杂度为O(N)。但是在处理大规模数据时,它的空间复杂度会成为瓶颈,因为需要开辟大量的空间来存储布尔数组。此时可以考虑使用其他的素数筛法,如欧拉筛、线性筛等。

4.代码解释

        定义函数countPrimes(n),函数的作用是计算小于n的质数个数,并返回这些质数。函数内部的具体实现思路如下:

  1. 首先,我们创建一个长度为n的列表 primes,初始值全部为 1,表示所有数字都是质数。

  2. 创建一个计数器 count,表示小于 n 的质数个数。

  3. 创建一个列表 li,用于存放所有小于 n 的质数。

  4. 遍历从 2 到 n-1 的每一个数字 i。

  5. 如果 primes[i] 等于 1,表示 i 是一个质数,将 count 加 1,并将 i 加入到 li 列表中。

  6. 接着,遍历从 i^2 开始,到 n-1 的每个 i 的倍数 j。因为从 2 到 i-1 的所有 i 的倍数已经被标记过了,因此我们从 i^2 开始。

  7. 将 primes[j] 标记为 0,表示 j 不是质数。

  8. 最后返回 count 和 li,分别表示小于 n 的质数个数和所有小于 n 的质数。

你可能感兴趣的:(蓝桥杯,python,蓝桥杯)