筛法计算质数表
特点:能够快速筛选出区间 [2,N] 中的所有质数
算法:
在整数区间[2,N]内,
① 保留 2 同时去掉其他 2 的倍数,
② 保留 3 同时去掉其他 3 的倍数,
③ 保留 5 同时去掉其他 5 的倍数,
④ 保留 7 同时去掉其他的倍数,……,以此类推,一直到所有小于
N 的质数的倍数都被去掉,剩余的数字就是质数表
筛法计算质数表实例
求出2到20之间的质数
第一步,取第一个非零数2(是质数),将其后面2的倍数全部置零(删掉)。得到
[ 2 3 0 5 0 7 0 9 0 11 0 13 0 15 0 17 0 19 0 ]
第二步,取下一个非零数3(是质数),将其后面3的倍数全部置零(删掉) 。得到
[ 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 0 ]
第三步,取下一个非零数5(是质数),将其后面5的倍数全部置零(删掉) 。得到
[ 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 0 ]
第四步,取下一个非零数7 (是质数),将其后面7的倍数全部置零(删掉) 。得到
[ 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 0 ]
……
代码实现:`
#include<iostream>
#define N 20
using namespace std;
int prime[N];//定义一个长度为N的数组,N为前面定义的常数
int main(){
int i, j;
for(i=2; i<=N; i++)//建立表[2 3 4 5 6 7 8 9 10...]
prime[i] = i;
for(i=2; i<N; i++){
if(prime[i]!=0)
for(j=i+i; j<=N; j+=i)//将2*i,3*i,4*i...置零
prime[j] = 0;
}
for(int i=0;i<=N;i++){
if(prime[i])
cout<<prime[i]<<" ";
}
return 0;
}