篩選法求 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]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章