埃氏篩法 素數篩

2022-08-21 21:48:12 字數 1020 閱讀 6677

埃式篩法:給定乙個正整數n(n<=10^6),問n以內有多少個素數?

做法:做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去……以此類推,如果表中剩餘的最小的數是m,那麼m就是素數。然後將表中所有m的倍數劃去,像這樣反覆操作,就能依次列舉n以內的素數,這樣的時間複雜度是o(nloglogn)。

題解:如果要是按照乙個乙個判斷是否是素數然後把ans+1,時間複雜度為o(n√n),對於10^6的資料時間複雜度就是o(10^9),必定會超時,但此時埃氏篩法的時間複雜度只有o(nloglogn)。

int prime[maxn];//

第i個素數

bool is_pri[maxn+10];//

is_pri[i]表示i是素數

//返回n以內素數的個數

int sieve(intn)}

return

p;}

區間素數篩:給定兩個正整數a、b(a主要思想:既然在之前已經講過b以內的和書的最小質因數不會超過√b。如果有√b以內的素數表的話,就可以把埃氏篩法運用在上面了。也就是說,我們可以先分別做好[2,√b)的表和[a,b)然後在第乙個表的是素數的前提下,刪去第二個表中的數即可。

#includeusing

namespace

std;

bool pri[1000000+10

];bool ispri[10000000+10];//

ispri[i-a]=true代表i是素數

void

getpri()

}}int

main()

}long

long cnt=0

;

for(int i=0;iif(ispri[i])cnt++;

if(a==1)cnt--;

printf(

"%lld\n

",cnt);

}

素數篩法(埃氏篩,線性篩)

時間複雜度o nloglogn void prime int b prime i 1則是合數 原理很簡單,所有合數可以表示為乙個質數跟另乙個數的積,列舉每個已知素數的倍數就能標記完。但很明顯,這樣做會有重複。比如12 3 4 2 6,在2這個素數進行倍數標記時會標記,在3這個素數進行倍數標記時同樣會...

素數 埃氏篩法

題目 求2 100以內的素數。素數 prime number 又稱質數,是指乙個大於1的自然數,除了1和它本身外,不能被整除以其他自然數。解法一 根據素數的定義,即用該數除比其小的數 1除外 都不能除盡,即為素數 public class prime if i n system.out.print ...

素數篩法 埃氏篩及尤拉篩

在做題中會經常遇到有關素數的問題,整理一下學過的兩種素數篩法。時間複雜度 o nloglogn 我們知道乙個素數的倍數肯定是乙個合數,乙個合數可以由多個素數相乘得到,所以可以從2開始把2的倍數篩一遍,找到下個素數在篩一遍。篩完後素數的倍數都被篩掉了,剩下的就是素數。如下 const int n 1e...