1.埃拉托色尼筛选法
这种方法效率较高,能处理的数据也很多,缺点就是数组必须很大,如果内存不大,那么就不能给数组成功分配内存,除此之外可以采用位来记录数据,这样处理的数据会更多的,或者考虑数据结构中的存储方式,但是麻烦哈。
#include <iostream>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define SIZE 100000
using namespace std;
int main()
{
int i; /*i表示整数和对应的下标*/
int j; /*j表示正要处理的质数j之前的已处理j之后的未处理*/
int k; /*k表示正在处理的j的倍数从2开始到j*k<SIZE*/
bool a[SIZE]; /*下标表示数字*/
memset(a,TRUE,sizeof(a)); /*初始化数组全是TRUE*/
a[0] = a[1] = FALSE; /*0和1不是质数设置为FALSE*/
i = 2;
while(i < SIZE)
{ /*找到下一个质数*/
while(a[i++] == TRUE)
{
j = i-1;
break;
}
for(k = 2; j*k < SIZE && i < SIZE; ++k)
{
a[j*k] = FALSE; /*质数的倍数不是质数,处理质数的倍数*/
}
}
for(i=2; i<SIZE; i++)
{
if(a[i]==TRUE)
{
printf("%8d", i);
}
}
printf("\n");
return 0;
}
2.优化版(效率更高)
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
#define N 10000001
bool prime[N];
int main()
{
prime[2]=true;
for(long i=3;i<N;i++)
{
if(i%2==0)
{
prime[i]=false;
}
else
{
prime[i]=true;
}
}
for(long i=3;i<sqrt(N);i++)
{
if(prime[i])
{
for(long j=2;j*i<N;j++)
{
prime[j*i]=false;
}
}
}
return 0;
}