判斷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