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