線性篩法求素數


 

這個是經典的Eraosthenes篩法:

1 for (int i = 2; i * i < N; i++)
2 {
3     if (tag[i]) continue;
4     for (int j = i; j * j < N; j++)
5         tag[i*j] = 1;
6 }
7 for (int i = 2; i < N; i++)
8     if (!tag[i])
9         prime[tol++] = i;

 

但是Eraosthenes篩法的速度並不快,原因在於對於一個合數,這種方法會重復的標記。一種線性篩素數的方法有效的解決了這一點,代碼如下:

 

 1 void get_prime()
 2 {
 3     int cnt = 0;
 4     for (int i = 2; i < N; i++)
 5     {
 6         if (!tag[i])    p[cnt++] = i;
 7         for (int j = 0; j < cnt && p[j] * i < N; j++)
 8         {
 9             tag[i*p[j]] = 1;
10             if (i % p[j] == 0)
11                 break;
12         }
13     }
14 }

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM