素数筛法就是每次把已知的素数的倍数晒去,筛掉前sqrt(N)中素数的倍数就可以了;
先把n个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。
/********
** 素数筛法
*********/
#include <stdio.h>
#include <math.h>
#define N 100001
bool prime[N];
void RemoveEven()//去掉偶数
{
prime[1] = false;
prime[2] = true;
for(int i=3; i<= N; i++)//先去掉2的倍数
{
if(i%2)
prime[i]=true;
else
prime[i]=false;
}
}
void GetEven()
{
int t=sqrt(N);
for(int i=3; i<=t;i++)
{
if(prime[i])
for(int j=2*i; j <= N; j+=i)//筛掉i的倍数
prime[j]=false;
}
}
int main()
{
RemoveEven();
GetEven();
for(int i=2; i <= N; i++)
{
if(prime[i])
printf("%d ", i);
}
return 0;
}