素数筛(Sieve of Eratosthenes)是一种用于找出一定范围内所有素数的经典算法。它的基本思路是从小到大逐个检查每个数,如果一个数是素数,那么就把它的所有倍数标记为非素数,因为素数除了1和它本身以外没有其他因数。这样,当算法执行完毕后,所有未被标记的数就是素数。
-
初始化:创建一个布尔数组(或者称为标记数组),用于记录每个数是否为素数。从2到n,并将所有元素初始化为
True
,表示一开始假设所有数都是素数。 -
筛选过程:从最小的素数2开始,遍历数组中的每一个数。如果当前数在数组中的对应位置为
True
(即它尚未被标记为非素数),那么它就是一个素数。 -
标记倍数:一旦确定一个数为素数,就将其所有倍数(从该素数的平方开始,因为小于该素数平方的倍数已经被更小的素数标记过了)在数组中的对应位置标记为
False
,表示这些数不是素数。 -
继续筛选:继续遍历数组中的下一个数,重复步骤2和3,直到遍历完所有需要检查的数。
-
收集素数:最后,遍历整个数组,收集所有标记为
True
的数,这些数就是所求范围内的所有素数。def sushushai(n): cnt=0 prime=[True for _ in range(n)]#根据题意,n以内的素数,不包括n ans='' x=2#1不是素数,从2开始找 while x*x<=n: #根号n的数就可以标记完n,假如x>根号n且存在因子i,那在循环i时被标记过了 if prime[x]: for i in range(x*x,n,x):#从x*x开始找,因为x*(x-1)已经在(x-1)那个循环里面标记过 prime[i]=False x+=1 for j in range(2,n): if prime[j]: ans=ans+str(j)+' ' cnt+=1 print(ans.rstrip()) print(cnt) return ans n=int(input()) sushushai(n)