素数

参考链接:https://cloud.tencent.com/developer/article/2054290

 

朴素素数:

bool rule(int n){
    for(int i=2;i*i<=n;i++)
        if(n%i==0) return false;
    return true;
}

 

埃氏筛法 :
从2开始,将每个质数的倍数都标记成合数(限制条件为倍数小于n),以达到筛选素数的目的。

 

复制代码
const int N=1e8;
int vis[N];
void prime(int n){
    vis[0]=vis[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            for(int j=i*i;j<=n;j+=i)//n是素数,所以n*n,n*(n+1)不是素数
                vis[j]=1;
        }
    }
}//当vis[i]==0的时候表示i为素数
复制代码

埃氏筛法的缺陷 :对于一个合数,有可能被筛多次。例如 30 = 2 * 15 = 3 * 10 = 5*6……如何确保每个合数只被筛选一次,我们用它的最小质因子来筛选,便是欧拉筛法。

此刻引入欧拉筛

欧拉筛:

让每个合数只被它的最小质因子筛选一次,以达到不重复的目的

复制代码
const int N=1e8;
int vis[N],prime[N];//vis的素数标记数组,prime保存素数
void Prime(int n){
    for(int i=2;i<=n;i++){
        if(!vis[i]) prime[++prime[0]]=i;//prime[0]为素数个数
        for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++){//遍历已经保存素数中
            vis[i*prime[j]]=1;
            if(i%prime[j]==0)break;//优化
//i = 8 ,j = 1,prime[j] = 2,如果不跳出循环,prime[j+1] = 3,8 * 3 = 2 * 4 * 3 = 2 * 12,在i = 12时会计算。因为欧拉筛法的原理便是通过最小素因子来消除。
} } }
复制代码

 

posted @   JerryTang菜菜  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示