篩法列舉質數
阿新 • • 發佈:2017-08-25
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] = false9 Output: all i such that A[i] is true
篩法列舉質數