AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

AcWing 868. 筛质数    原题链接    简单

作者: 作者的头像   Doc_kk ,  2023-03-19 16:57:48 ,  所有人可见 ,  阅读 26


0


//朴素筛 == 埃氏筛 把每个质数的倍数看作合数删掉
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6+10;
int prime[N],cnt;//prime放质数
bool st[N];//st[i] = true == 不是质数要被筛掉 

void get_prime(int n){
    for(int i = 2 ; i <= n ; i ++){//质数都是从2开始的
        if(st[i]) continue;//如果当前i不是质数 就跳过/筛掉
        prime[cnt++] = i;//如果通过上面一个判断是质数了 就把这个记下来 cnt也是要记录的
        for(int j = i + i ; j <= n ; j += i) 
        st[j] = true;//从i+i开始遍历 每次加i就是i的倍数 把他们置true筛掉
    }
}

int main(){
    int n;
    cin >> n ;
    get_prime(n);
    cout << cnt << endl;
    return 0;
}
//线性筛 i是质数就筛掉i与prime中所有质数的乘积;i是非质数筛掉i与prime中所有<=最小质因子的乘积
#include <iostream>
using namespace std;
const int N = 1e6+10;
int prime[N],cnt;
bool st[N];//true = 不是素数该被筛掉

void get_prime(int n){
    for (int i = 2; i <= n ; i++){
        if(!st[i]) prime[cnt++] = i;//如果i是素数(不该被筛掉) 把i存进prime数组里
        for(int j = 0; prime[j] <= n / i; j ++){//j从小到大枚举所有质数
            st[prime[j] * i] = true;//每次筛掉当前的质数和i的乘积
            if(i % prime[j] == 0)break;//i是j号质数的倍数时 j号质数是i*j号质数的最小质因子
            //i % prime[j] != 0时 说明j号质数小于i的所有质因子 所以j号质数还是i*j号质数的最小质因子
        }
    }
}

int main(){
    int n ;
    cin >>n ;
    get_prime(n);
    cout << cnt <<endl;
    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息