【算法基础】筛质数

文章目录


问题描述

给定一个正整数 n n n,请你求出 1 ∼ n 1∼n 1∼n 中质数的个数。

输入格式

共一行,包含整数 n。

输出格式

共一行,包含一个整数,表示 1∼n 中质数的个数。

数据范围
1 ≤ n ≤ 1 0 6 1≤n≤10^6 1≤n≤106


解决方法

朴素筛法

从前往后遍历,把每个数的倍数都删掉,剩下的数就是质数

证明方法在前面的一个打卡里面写了,复杂度是O(nlogn)

这里优化一下,只需要把所有质数的倍数删掉即可,证明也是在上一篇文章里面讲了

这里是时间复杂度为O(nloglogn),这里把它叫做埃氏筛法

代码实现

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 1000010;
bool st[N];
int cnt, primes[N];

int get_primes(int n){
    for(int i = 2; i <= n; i++){
        if(!st[i]){
            primes[cnt++] = i;
            for(int j = i + i; j <= n; j += i) st[j] = true;
        }
    }
    return cnt;
}

int main(){
    int n;
    cin >> n;
    int res = get_primes(n);
    cout << res << endl;

    return 0;
}

线性筛法

思想 :把每一个合数用它的某一个质因子筛掉即可

每个合数x一定会被筛掉,而且筛的时候一定用的是最小质因子,

而且每个数只有一个最小质因子,所以每个数只会被筛一次,所以是线性的。

代码实现

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 1000010;
bool st[N];
int cnt, primes[N];

int get_primes(int n){
    for(int i = 2; i <= n; i++){
        if(!st[i]) primes[cnt++] = i;   //如果是质数,把它放到数表里面去
        //从小到大枚举所有的质数
        for(int j = 0; primes[j] <= n / i; j++){
            st[primes[j] * i] = true;       //把primes[j]这个质数的某个倍数筛掉即可(核心思想)
            //这个合数是前面某一个质数的倍数,已经筛掉了
            if(i % primes[j] == 0) break;   //(因为是从小到达枚举的所有的质数,所以第一次出现的primes[j]一定是i的最小质因子)
        }
    }
    return cnt;
}

int main(){
    int n;
    cin >> n;
    int res = get_primes(n);
    cout << res << endl;

    return 0;
}

作者:为梦而生

链接:https://www.acwing.com/file_system/file/content/whole/index/content/10509230/

来源:AcWing

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
福尔摩斯张10 小时前
Axios源码深度解析:前端请求库设计精髓
c语言·开发语言·前端·数据结构·游戏·排序算法
算法与编程之美10 小时前
提升minist的准确率并探索分类指标Precision,Recall,F1-Score和Accuracy
人工智能·算法·机器学习·分类·数据挖掘
MicroTech202510 小时前
微算法科技(NASDAQ :MLGO)混合共识算法与机器学习技术:重塑区块链安全新范式
科技·算法·区块链
李牧九丶10 小时前
从零学算法1334
前端·算法
在繁华处10 小时前
C语言经典算法:汉诺塔问题
c语言·算法
思成不止于此11 小时前
【C++ 数据结构】二叉搜索树:原理、实现与核心操作全解析
开发语言·数据结构·c++·笔记·学习·搜索二叉树·c++40周年
爪哇部落算法小助手11 小时前
每日两题day50
数据结构·c++·算法
curry____30312 小时前
基本算法(2025.11.21)
c++·算法
WWZZ202513 小时前
快速上手大模型:深度学习5(实践:过、欠拟合)
人工智能·深度学习·神经网络·算法·机器人·大模型·具身智能
司铭鸿13 小时前
图论中的协同寻径:如何找到最小带权子图实现双源共达?
linux·前端·数据结构·数据库·算法·图论