0
点赞
收藏
分享

微信扫一扫

【Python 百练成钢】Python语言解决素数筛选问题的几种方式【朴素素数筛、埃氏筛、欧拉筛】

椰果玩安卓 2022-04-03 阅读 35

文章目录

🤡前言🤡


在这里插入图片描述


💟素数筛问题描述💞


💟新手筛💞


💙问题分析💙

💙代码实现💙

import time
n=int(1e6)
ans=0
def sieve(n):
    for i in range(2,n):
        if n%i==0:
            return False
    return True

start=time.time()
for i in range(2,n):
    if sieve(i):
        ans+=1
end=time.time()
print(f"阶乘结果{ans}用时{end-start}")

💟新手优化筛💞


💜问题分析💜

💜代码实现💜

import time
n=int(1e6)
ans=0
def sieve(n):
    for i in range(2,int(math.sqrt(n))+1):
        if n%i==0:
            return False
    return True

start=time.time()
for i in range(2,n):
    if sieve(i):
        ans+=1
end=time.time()
print(f"阶乘结果{ans}用时{end-start}")

💟埃氏筛💞


🤍问题分析🤍

🤍代码实现🤍

import time
n=int(1e6)
ans=0
start=time.time()
ans=[False]*(n+1)
ans[0]=False
ans[1]=True
for i in range(2,int(math.sqrt(n+1)+1)):
    if not ans[i]:
        for j in range(i*i,n+1,i):
            ans[j]=True
end=time.time()
print(f"阶乘结果{n-sum(ans)}用时{end-start}")

💟欧拉筛(线性筛)💞


💗问题分析💗

💗代码实现💗

import time
n=int(1e6)
ans=0
start=time.time()
ans=[False]*(n+1)
ls=[]
ans[1]=True
s=0
for i in range(2,n+1):
    if not ans[i]:
        ls.append(i)
    s=len(ls)
    for j in range(s):
        if i*ls[j] >n:
            break
        ans[i*ls[j]]=True
        if i%ls[j]==0:
            break
end=time.time()
print(len(ls),end-start)

你学废了吗?🦖


举报

相关推荐

0 条评论