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)
埃氏筛(Sieve of Eratosthenes)是一种古老的素数筛法,可以用来快速地找出小于等于某个正整数N的所有素数。它的名字来自于古希腊学者埃拉托斯特尼(Eratosthenes)。
该算法的基本思想是:先用最小的素数2去筛,把2的倍数都标记成合数,然后再用下一个素数去筛,重复这个过程直到所有小于等于N的数都被筛过一遍。最后未被标记的数就是素数。
具体实现过程可以用一个长度为N的布尔数组来表示每个数字是否为素数,初始时所有元素都被标记为素数,然后从2开始枚举每个素数p,将p的所有倍数都标记为合数(即在布尔数组中标记为false),直到p*p>N为止。最后所有未被标记为合数的元素就是素数。
埃氏筛法是一种简单高效的算法,时间复杂度为O(NloglogN),空间复杂度为O(N)。但是在处理大规模数据时,它的空间复杂度会成为瓶颈,因为需要开辟大量的空间来存储布尔数组。此时可以考虑使用其他的素数筛法,如欧拉筛、线性筛等。
定义函数countPrimes(n),函数的作用是计算小于n的质数个数,并返回这些质数。函数内部的具体实现思路如下:
首先,我们创建一个长度为n的列表 primes,初始值全部为 1,表示所有数字都是质数。
创建一个计数器 count,表示小于 n 的质数个数。
创建一个列表 li,用于存放所有小于 n 的质数。
遍历从 2 到 n-1 的每一个数字 i。
如果 primes[i] 等于 1,表示 i 是一个质数,将 count 加 1,并将 i 加入到 li 列表中。
接着,遍历从 i^2 开始,到 n-1 的每个 i 的倍数 j。因为从 2 到 i-1 的所有 i 的倍数已经被标记过了,因此我们从 i^2 开始。
将 primes[j] 标记为 0,表示 j 不是质数。
最后返回 count 和 li,分别表示小于 n 的质数个数和所有小于 n 的质数。