1. 程式人生 > >篩法列舉質數

篩法列舉質數

close ron mark 個數 set 因數 最小 技術 span

思想:標記出所有非質數,輸出所有未被標記的數。

對於n以內的篩選來說,如果n是合數,則有 1 ≤ c ≤ √n ,即 1 ≤ c2 ≤ n , c是n的最小正因數。只要找到了c就可以確定n是合數並將n標記。

技術分享
1     int n = 15;
2     int mark[16] = {
3         1, 1, 0, 0,
4         0, 0, 0, 0,
5         0, 0, 0, 0,
6         0, 0, 0, 0
7     };
View Code

設n = 15,先聲明一個數組mark,裏面除了0和1被標記為1(即為false)之外,別的都未被標記。已知2為最小的質數,所以我們讓2作為第一個正因數,開始篩選,篩選完後輸出15以內的所有質數:

 1     int c;
 2     int j;
 3     for (c = 2; c * c <= n; c++) {
 4         if (mark[c] != 1) {
 5             for (j = 2; j <= n / c; j++) {
 6                 mark[c * j] = 1;
 7             }
 8         }
 9     }
10     for (c = 2; c <= n; c++) {
11         if (mark[c] != 1) {
12             printf("
%d\n", c); 13 } 14 }

偽代碼:

1 function Eratosthenes
2     Let A be an array of Boolean values,
3     indexed by integers 2 to n
4     initially all set to true.
5     for index from 2 to sqrt(n)
6         if A[i] is true
7             for j from 2 to n/index
8                 A[j] = false
9 Output: all i such that A[i] is true

篩法列舉質數