1.using namespace std; 2. 3.const int maxn = 1000005; 4.bool isPrime[maxn]; //判斷是否為素數
5.int primeNum[maxn]; //統計1~x 的素數
6. 7.void solve(int n) { 8. int i, num = 0; //num:統計已經識別的素數
9. for(i=0; i<n; i++) { 10. isPrime[i] = true; //初始化
11. } 12. isPrime[0] = isPrime[1] = false; //0、1都不是素數
13. for(i=2; i<=n; i++) { //從2開始判斷
14. primeNum[i] = num; //合數前面的素數就是之前通過素數判斷的
15. if(isPrime[i]) { //如果不是素數則不篩選
16. primeNum[i] = ++num; //新添加一個素數
17. for(int j=2*i; j<=n; j+=i) { //能整除非 1 的數都是合數
18. isPrime[j] = false; //標記判非素數
19. } 20. } 21. } 22.} 23. 24.void show(int n) { //打印1~n的素數
25. printf("1 ~ %d的素數共有:%d\n", n, primeNum[n]); 26.} 27. 28.int main() { 29. solve(maxn); 30. int n; 31. while(~scanf("%d", &n)) { //連續輸入,以^z結束輸入
32. show(n); 33. } 34. 35. return 0; 36.}
這種方式計算1~N之間的素數效率比一般的1~N循環遍歷更高, 主要減少了每個素數的常規判斷時間.