埃式筛法
引入
背景
埃式筛法,也称为埃拉托斯特尼筛法(Sieve of Eratosthenes),是一种由希腊数学家埃拉托斯特尼提出的简单算法,用于检定素数。这种方法通过逐步剔除不大于根号n的所有素数的倍数,从而找出自然数n以内的全部素数。
题目
给定正整数n,请求出1 , 2 , … , n 间所有质数
输入格式
一个正整数n
输出格式
一行多个整数,表示1 , 2 , … , n 间所有质数,每个质数用空格隔开。
样例输入 1
10
样例输出 1
2 3 5 7
算式
要得到自然数n以内的全部素数,必须把不大于
的所有素数的倍数剔除,剩下的就是素数。
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。
步骤
- 初始化:首先,列出从2开始的所有自然数序列。
- 筛选过程:
- 用2去除序列中的所有倍数,留下非2的倍数。
- 接着用下一个质数3去除剩余数字中的3的倍数,留下非3的倍数。
- 重复此过程,每次选择未被剔除的下一个质数,去除该质数的倍数,直到序列中的下一个质数大于当前序列中最大数的平方根为止。
- 结束条件:如果剩余序列中的最大数小于当前筛选质数的平方,则剩余的数字均为素数。
例如,假设我们要找出小于或等于10的所有素数:
- 第一步,列出2到25的数字:2, 3, 4, 5, 6, 7, 8, 9, 10。
- 第二步,用2去除所有2的倍数(留下2),用3去除所有3的倍数(留下3),用5去除所有5的倍数(留下5),用7去除所有7的倍数(留下7)。
- 第三步,继续这个过程,直到找到所有的素数:2, 3, 5,7。
实现代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 1;
int n;
bool flag[N] = {1, 1};
void Eratothenes() {
for (int i = 2; i * i <= n; ++i)
if (!flag[i])
for (int j = 2; i * j <= n; ++j) flag[i * j] = 1;
}
int main() {
scanf("%d", &n);
Eratothenes();
for (int i = 2; i <= n; ++i)
if (!flag[i]) printf("%d ", i);
return 0;
}