假如要求2至20所有的质数:
1.建立两个数组a[20]和pri[20](pri数组中只存储质数 )
2.令i=2。从2开始依次遍历所有数,如果2是质数,将2放入pri数组,然后用2乘pri数组内的数并标记(标记4)
pri:2
3.令i+1=3。因为3未标记,所以将3放入pri数组。3依次乘pri数组内的所有数并标记(标记6,9),这些标记的数不是质数。
pri:2 ,3
4.令i+1=4。当4乘2时,发现4%2==0即4是2的倍数,这时就不用往后乘了(标记8),因为4标记
了,所以不放入pri数组。
5.令i+1,以此类推,直至遍历完a数组内所有数,最后输出pri数组内的数即质数。
优点:不会重复标记同一个数,提高效率。因为要保证每一个标记的数都是最小两个因子之和。
如:12=3*4=3*2*2=2*6,这时就选12=2*6;
以下是求100000内的质数程序:
#include<iostream>
using namespace std;
int main()
{
int a[100000]={0},pri[10000]; //pri数组中只存储质数
int num,i,j;
num=0;
for(i=2;i<100000;i++)
{
if(a[i]==0)
{
pri[++num]=i;
}
for(j=1;j<=num;j++)
{
if(pri[j]*i>100000)
{
break;
}
a[i*pri[j]]=1;
if(i%pri[j]==0) //i是获取过程中的一个普通数字(即可能是质数,也可能是合数)
{
break;
}
}
}
for(i=1;i<=num;i++)
{
cout<<pri[i]<<endl;
}
}