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循环遍历更高, 主要减少了每个素数的常规判断时间.