【C++】埃式筛法
介绍:埃拉托斯特尼筛法(sieve of Eratosthenes)
,简称埃氏筛
或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
步骤:
- 列出2~n之间的所有数字 (2为最小质数)
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- 将最小的质数2的倍数全部标记上
2
3
4 5
6
7
8 9
10
11
12 13
14
15
16 - 将倒数第二小的质数的倍数标记上
2
3
4 5
6 7
8 9 10
11
12 13
14
15 16 - 以此类推直到全部质数都标记完毕,则未被标记即为2~n的质数
2
3
4 5
6 7
8 9 10 11
12 13
14 15 16
示例代码:求l ~ r之间的质数。
#include <iostream>
using namespace std;
int l, r, m, p[10005];
/* l:左起点,r:右起点,m:记录质数个数,p:存储质数的数组
*/
bool isnp[10005];//isnp:记录当前数是否为质数(用于标记)
int main()
{
cin >> l >> r;
m = 0;//初始化m
for (int i = 2; i <= r; i++)//循环2~n之间的数
{
if (!isnp[i])//如果此数未被标记,即为质数
{
m++;//质数个数+1
p[m] = i;//存储这个质数
for (int j = i*2; j <= r; j += i)//将这个质数的倍数全部标记上,他们均为合数
{
isnp[j] = true;//进行标记
}
}
}
for (int i = 1; i <= m; i++)//遍历质数存储器p
{
if (p[i] >= l)//判断此质数是否为区间数
cout << p[i] << " ";
}
return 0;
}
打包成函数:
void SOE(int n)
{
int m, p[10005];
bool isnp[10005];
m = 0;
for (int i = 2; i <= n; i++)
{
if (!isnp[i])
{
m++;
p[m] = i;
for (int j = i*2; j <= n; j += i)
{
isnp[j] = true;
}
}
}
}
希望以上内容对您有所帮助!