Python算法

文章介绍了在处理大数时,传统素数筛选方法可能会超时的问题,并提出了埃氏筛(埃拉托斯特尼筛法)作为解决方案。埃氏筛通过遍历并标记合数的倍数,有效地筛选出素数。示例代码展示了如何使用埃氏筛找到一定范围内的所有素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

素数的筛选

如果用传统的筛遇到大数很容易超时,所以通过一些限制条件筛掉非素数

传统筛选模板:

def is_prime(i):
    if x==0 or x==1:
        return 0
    for i in range(2,int(x**0.5)+1):
        if x%i==0:
           return 0
    return 1

下面介绍筛选方法中的埃氏筛

埃氏筛的思路不是找素数,而是去非素数

通过遍历到的i再把i的倍数全部去掉,以此达到只存在素数的效果

例:筛选1~N-1之间的素数

N=int(1e6)#一般最大可以用到1e6,1e7会超过内存
prime=[0]*N
vis=[0]*N
def E_sieve(x):
  for i in range(2,int((x**0.5)+1)):
    if not vis[i]:#如果没被筛过
      for j in range(i*i,n+1,i):
        vis[j]=1#标记
  k=0
  for i in range(2,n):
    if not vis[i]:
      prime[k]=i
      k+=1
  return k
n=int(input())
k=E_sieve(n-1)
for i in range(0,k):
  print(prime[i],end=' ')
print()
print(k)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王大炮1111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值