筛选法求 N 以内的所有素数

筛选法具体步骤:
以筛选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]);
    }
}
发布了146 篇原创文章 · 获赞 82 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40860852/article/details/102643427