普通的线性筛法:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAX 1000 // 范围
using namespace std;
int a[MAX],cnt;
bool ispr[MAX];
void prime()
{
cnt = 1;
memset(ispr,1,sizeof(ispr));
ispr[0] = ispr[1] = 0; // 0和1都不是素数
for(int i = 2; i < MAX ; i++)
{
if(ispr[i])
{
a[cnt++] = i; // 保存素数
}
for(int j = i*2;j <= MAX; j += i)
{
ispr[j] = 0; // 素数的倍数都为合数
}
}
}
int main()
{
prime();
for(int i = 1; i < cnt ; i++)
{
printf("%d ",a[i]);
}
return 0;
}
优化后的线性筛法:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define MAX 1111 // 求素数的范围
using namespace std;
int a[MAX],cnt;
bool ispr[MAX];
void prime()
{
cnt = 1;
memset(ispr,1,sizeof(ispr));
ispr[0] = ispr[1] = 1; // 0和1不是素数
for(int i = 2; i <= MAX ; i++)
{
if(ispr[i])
a[cnt++] = i; // 保存素数
for(int j = 1; j < cnt && a[j]*i < MAX; j++)
{
ispr[a[j]*i] = 0; // 筛掉小于等于i的素数和i的积构成的合数
}
}
}
int main()
{
prime();
for(int i = 1; i < cnt; i++)
{
printf("%d ",a[i]);
}
return 0;
}