1 /******************************************************************** 2 created: 2013/10/22 3 created: 22:10:2013 12:51 4 file base: 埃拉托色尼篩子 5 file ext: cpp 6 author: Justme0 (http://blog.csdn.net/Justme0) 7 8 purpose: 高效篩選素數 9 *********************************************************************/ 10 #include <iostream> 11 #include <vector> 12 #include <cassert> 13 using namespace std; 14 15 /* 16 ** initially all set to true 17 */ 18 void initiate(vector<bool> &A) { 19 assert(A.size() >= 3); 20 for (unsigned i = 2; i < A.size(); ++i) { 21 A[i] = true; 22 } 23 } 24 25 /* 26 ** the size of A is n+1 27 ** Let A be an array of Boolean values, indexed by integers 2 to n 28 */ 29 void sieveOfEratosthenes(vector<bool> &A) { 30 assert(A.size() >= 3); 31 32 initiate(A); 33 34 int n = A.size() - 1; 35 for (int i = 2; i * i <= n; ++i) { 36 if (A[i]) { 37 for (int j = i * i; j <= n; j += i) { 38 A[j] = false; 39 } 40 } 41 } 42 } 43 44 void outputPrime(const vector<bool> &A) { 45 int cnt = 1; 46 for (unsigned i = 2; i < A.size(); ++i) { 47 if (A[i]) { 48 cout << cnt++ << '\t' << i << endl; 49 } 50 } 51 } 52 53 int main(int argc, char **argv) { 54 int n; 55 while (cout << "請輸入數字:\n", cin >> n) { 56 vector<bool> A(1 + n); 57 sieveOfEratosthenes(A); 58 outputPrime(A); 59 } 60 61 system("pause"); 62 return 0; 63 } 64 65 /* 66 67 #include <iostream> 68 #include <algorithm> 69 #include <cassert> 70 using namespace std; 71 72 const int LENGTH = 26; 73 74 void getPrimeNum(int *a, int len) { 75 assert(len >= 3 && "長度不足"); 76 77 a[0] = -1; 78 a[1] = -1; 79 80 // 1. 小於sqrt(n)便可 81 for (int primeIndex = 2; primeIndex * primeIndex < len - 1; ++primeIndex) { 82 while (-1 == a[primeIndex]) { 83 ++primeIndex; 84 if (primeIndex >= len) { 85 return ; 86 } 87 } 88 89 // 2. 從primeIndex^2開始 90 for (int i = primeIndex * primeIndex; i < len; i += primeIndex) { 91 a[i] = -1; 92 } 93 } 94 } 95 96 int main(int argc, char **argv) { 97 int a[LENGTH]; 98 for (int i = 0; i < LENGTH; ++i) { 99 a[i] = i; 100 } 101 102 getPrimeNum(a, LENGTH); 103 104 for (int i = 0, cnt = 1; i < LENGTH; ++i) { 105 if (a[i] != -1) { 106 cout << cnt++ << '\t' << a[i] << endl; 107 } 108 } 109 110 return 0; 111 } 112 113 */