1 条题解
-
0
#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; }
信息
- ID
- 1229
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者