筛选法具体步骤:
以筛选15以内的素数为例
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
1)从2开始(1不是素数),2是素数,因此2的倍数一定不是素数,故排除了4、6、8、10、12、14
,将数组不是素数的位置直接置零
0,2,3,0,5,0,7,0,9,0,11,0,13,0,15
2)判断3位置是否为零,为零说明已经被排除,肯定不是素数,不是零,因此3的倍数一定不是素数,故排除了6、9、12、15
0,2,3,0,5,0,7,0,9,0,11,0,13,0,15
3)4位置为零,判断下一个
0,2,3,0,5,0,7,0,9,0,11,0,13,0,15
4)5位置不为零,排除10、15
0,2,3,0,5,0,7,0,9,0,11,0,13,0,0
5)6位置为零,判断下一个
0,2,3,0,5,0,7,0,9,0,11,0,13,0,15
…
最后数组中所有非素数位置都变为了零,非零位置就是我们需要找到的素数
void Screening(int size) {
//1不是素数,从2开始循环
int *arr = new int[size];
for (int i = 0; i < size; ++i) {
arr[i] = i;
}
for (int i = 2; i < size; ++i) {
if (arr[i] != 0) {
//arr[i]的倍数一定不是素数
for (int j = 2 * i; j < size; ++j) {
if (arr[j] % arr[i] == 0)
arr[j] = 0;
}
}
}
//循环输出所有素数,为零的位置不是素数,非零位置是素数
for (int i = 2; i < size; ++i) {
if (arr[i] != 0)
printf("%d ", arr[i]);
}
}