质数筛法

坑待填

埃氏筛

原理

\(0\)\(1\)特判后枚举\([2,\sqrt{N}]\)内的数,

通过标记这些数的合数的方式来进行筛选。

代码实现

#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 1e2 + 6;
int input_arr[MAX_N];
int input(int *input_arr)
{
    int amount;
    cin >> amount;

    int input_num;
    for (int i = 0; i < amount; ++i)
    {
        cin >> input_num;
        input_arr[i] = input_num;
    }
    // 一开始的amount被input()读走了,可main()里还要再用一次
    // 因为作用域的存在,main不能直接使用input里的amount,
    // 所以input就需要把amount的值再返还给main
    // 这样main才知道amount的值
    // (其实直接在main里读取,然后以参数的形式传入input也是可以的)
    return amount;
}

const int MAX_PRIME = 1e5 + 6;
// 如果下标对应的数字不是质数,那么它就会被赋值为1(true),而其他的则为初始值0(false)
bool prime_by_sub[MAX_PRIME];
// 埃氏筛
void era_prime(void)
{
    prime_by_sub[0] = prime_by_sub[1] = 1;
    for (int i = 2; i <= sqrt(MAX_PRIME); ++i)
    {
        // 这里j从i * i开始,因为i * i之前的数字都被筛过了,
        // j += i即j是i的倍数
        for (int j = i * i; j <= MAX_PRIME; j += i)
        {
            prime_by_sub[j] = 1;
        }
    }
}

int main(void)
{
    // 输入
    int amount = input(input_arr);
    // 开筛
    era_prime();

    // 输出结果
    for (int i = 0; i < amount; ++i)
    {
        // 如果第i个数在prime_by_sub中是0(false,没有被动过),那么它是质数
        if ( ! prime_by_sub[ input_arr[ i ] ] )
        {
            cout << input_arr[i] << " ";
        }
    }

    
    return 0;
}
posted @ 2020-06-20 13:30  ShyButHandsome  阅读(107)  评论(0编辑  收藏  举报