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

posted @ 2019-07-20 19:46  a最简单  阅读(1180)  评论(0编辑  收藏  举报