• 质数筛法


    坑待填

    埃氏筛

    原理

    (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;
    }
    
  • 相关阅读:
    RAISERROR (Transact-SQL)的用法
    Eclipse 工程中set() get()等方法报错的解决方法
    SqlServer单步调试
    centOS7 查看防火墙状态
    如何查看Linux端口占用情况
    异常处理机制(Begin try Begin Catch)
    inner join 、left join 、right join 和full join的区别
    Emacs 快速指南
    x01.DiamondIDE: hello ide
    剑指offer大总结
  • 原文地址:https://www.cnblogs.com/ShyButHandsome/p/13168406.html
Copyright © 2020-2023  润新知