1. 程式人生 > >素數篩法

素數篩法

for 都去 n) break true class ++ i++ int

一、埃式篩法

埃式篩法的核心思想是從2到n枚舉,當我們找到一個質數時,枚舉它所有的倍數,因為這些倍數都不可能是質數。

for(int i=2; i<=n; i++) {
    if(!vis[i]) {
    prime[++cnt]=i;
    for(int j=i*2; j<=n; j+=i)
        vis[j]=true;
    }
}

時間復雜度是O(n log log n)

如果無論質數合數,每次都去找倍數的話,復雜度會退化成O(n|n n)

二、歐拉篩(線性篩)

  歐拉篩的核心思想是通過讓每個數只會被它的最小的質因子篩到,從而每個數只會被篩一次,時間復雜度O(n)

  對於任意一個合數,我們可以拆成最小質因子*某數i的形式。我們枚舉某數i,然後在枚舉所有篩出的質數。

  當我們枚舉的質數可以整除i時,如果再往大裏枚舉,枚舉的質數就不可能是最小質數了,這時就可以終止循環,繼續枚舉下一個i了

for(int i=2; i<=n; i++) {
    if(!isprime[i])
        prime[++primesize]=i;
    for(int j=1; j<=primesize && i*prime[j]<=n; j++) {
        isprime[i*prime[j]]=1
; if(i%prime[j]==0) break; } }

自己選的路,跪著也要走完!!!

素數篩法