【素数筛】python

素数筛(Sieve of Eratosthenes)是一种用于找出一定范围内所有素数的经典算法。它的基本思路是从小到大逐个检查每个数,如果一个数是素数,那么就把它的所有倍数标记为非素数,因为素数除了1和它本身以外没有其他因数。这样,当算法执行完毕后,所有未被标记的数就是素数。

  1. 初始化:创建一个布尔数组(或者称为标记数组),用于记录每个数是否为素数。从2到n,并将所有元素初始化为 True,表示一开始假设所有数都是素数。

  2. 筛选过程:从最小的素数2开始,遍历数组中的每一个数。如果当前数在数组中的对应位置为 True(即它尚未被标记为非素数),那么它就是一个素数。

  3. 标记倍数:一旦确定一个数为素数,就将其所有倍数(从该素数的平方开始,因为小于该素数平方的倍数已经被更小的素数标记过了)在数组中的对应位置标记为 False,表示这些数不是素数。

  4. 继续筛选:继续遍历数组中的下一个数,重复步骤2和3,直到遍历完所有需要检查的数。

  5. 收集素数:最后,遍历整个数组,收集所有标记为 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值