埃氏筛法
int main()
{
const int maxNumber=200;
int isPrime[maxNumber];
int i;
int x;
for (i=0;i<maxNumber;i++)
{
isPrime[i]=1;
}
for (x=2;x<maxNumber;x++)
{
if (isPrime[x])
{
for (i=2;i*x<maxNumber;i++)
{
isPrime[i*x]=0;
}
}
}
for (i=2;i<maxNumber;i++)
{
if (isPrime[i])
{
printf("%d\t",i);
}
}
printf("\n");
return 0;
}
首先初始化零和一,然后是整个数组,全部初始化为一,表示目前都是素数。
然后开始筛选,从二开始,如果判断数组里面为一,说明这个数是素数,第一个进去的是二,二自然是素数,然后第一遍筛去二的所有倍数,然后再进入三,筛去三的所有倍数。
对于四来说,它在标记数组里面的值已经是零了,所以无法进入,也就不再筛去,筛过一遍之后便不再筛除,节省时间。
但是这也只是相对的,比如欧拉筛法。
欧拉筛法
#include <cstdio>
#include <cstring>
int prime[1000];
int p[1000];
int main()
{
int tot = 0;
memset(p, 0, sizeof(p));
memset(prime, 0, sizeof(prime));
for (int i = 2; i < 1000;i++) {
if (prime[i]==0) {
p[tot++] = i;
}
for (int j = 0; j <= tot & i * p[j] < 1000;j++) {
prime[i * p[j]] = 1;
if (i%p[j]==0)
break;
}
}
for (int i = 0; i < 20;i++)
printf("%d\n", p[i]);
return 0;
}
欧拉筛法实际上就是让一个数只被它的最小素因子筛去即可,我们假设p是i的最小素因子,然后把比p小的素数都乘以i,得到一个和数,然后筛去即可。