MENU

【模板】素数筛

March 30, 2023 • 算法

关于素数筛的介绍,可以浏览这篇文章:素数筛 - 五葉魔法书 (grimoire.cn),本文给出一种更简洁的埃氏筛写法

/*
 * @Author: NorthCity1984
 * @LastEditTime: 2023-03-30 20:25:41
 * @Description:
 * @Website: https://grimoire.cn
 * Copyright (c) NorthCity1984 All rights reserved.
 */
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>

using namespace std;

const int N = 1e6 + 10;
const int M = 1e9 + 10;
const int INF = INT32_MAX;

// 用于判断小于 size 的数字是否是素数
vector<bool> getPrimeMap(int size) {
    vector<bool> vis(size, true);
    for (int i = 2; i < size; i++) {
        if (!vis[i]) {
            continue;
        }
        for (int j = 2; j * i < size; j++) {
            vis[i * j] = false;
        }
    }
    return vis;
}

// 返回小于 size 的所有素数
vector<int> getPrimeList(int size) {
    vector<int> prime;
    vector<bool> vis(size, true);
    for (int i = 2; i < size; i++) {
        if (!vis[i]) {
            continue;
        }
        prime.push_back(i);
        for (int j = 2; j * i < size; j++) {
            vis[i * j] = false;
        }
    }
    return prime;
}

int main() {
    auto prime = getPrimeList(100);

    for (auto i : prime) {
        cout << i << " ";
    }
    cout << endl;

    auto primeMap = getPrimeMap(100);
    cout << "2 is " << (primeMap[2] ? "" : "not ") << "prime number" << endl;
    cout << "6 is " << (primeMap[6] ? "" : "not ") << "prime number" << endl;

    return 0;
}
作者:NorthCity1984
出处:https://grimoire.cn/algorithm/mb-sss.html
版权:本文《【模板】素数筛》版权归作者所有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任