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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM