质数筛法

坑待填

埃氏筛

原理

\(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;
}

原文链接: https://www.cnblogs.com/ShyButHandsome/p/13168406.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    质数筛法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/357280

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午11:41
下一篇 2023年3月2日 上午11:41

相关推荐