1 条题解

  • 0
    @ 2026-2-4 17:13:05
    #include <bits/stdc++.h>
    using namespace std;
    
    bool flag[100001000]; // 标记数组,flag[i]为true表示i是素数
    int arr[100100000] = {0}; // 存储筛选出的素数
    int x = 0; // 记录素数的个数
    
    // [1] 欧拉筛(线性筛)核心函数:筛选出1~n中的所有素数
    void f(int n){
        // 初始化标记数组,默认所有数都是素数(true)
        memset(flag, true, sizeof(flag));
        
        // [2] 遍历2到n的所有数,进行筛选
        for(int i = 2; i <= n; i++){
            if(flag[i]){ // [3] 如果当前数是素数,加入素数数组
                arr[x] = i;
                x++;
            }
            // [4] 用当前数i与已有的素数相乘,标记其倍数为非素数
            for(int j = 0; j < x && i * arr[j] <= n; j++){
                flag[arr[j] * i] = false;
                // [5] 关键优化:若i能被当前素数arr[j]整除,说明后续倍数会被更小的素数标记,提前终止循环
                if(i % arr[j] == 0) break;
            }
        }
    }
    
    int main(){
        int n; // 输入的正整数n
        cin >> n;
        f(n); // 调用筛法函数
        cout << x; // 输出1~n中素数的个数
        return 0;
    }
    
    • 1

    信息

    ID
    1229
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者