篩法的思想:對於不超過n的每個非負整數p,刪除2p,3p,4p,5p,…,當處理完所有數之後,還沒有被刪除的數就是素數
這是簡易版的篩法,也最好理解
for(int i=2;i<=n;i++)
for(int j=i*2;j<=n;j+=i)
vis[j]=false;
還可以繼續改進,為什麼呢?給定外層迴圈變數i,內層迴圈的次數n/i-1改進:內層迴圈不必從i*2開始,它已經在i=2時被篩掉了
#include#include#includeusing namespace std;
bool vis[9999];
void eratosthenes() //eratosthenes篩法
int main()
{ int temp,n;
memset(vis,true,sizeof(vis)); //素數表初始化
eratosthenes();
while(cin>>n) //輸入區間上限
{ temp=0;
for(int i=0;i<=n;i++) //素數表初始化
{if(temp%10==0&&temp!=0)
{temp=0;
cout《素數定理:count(x)=x/ln x
count(x)表示不超過x的素數個數,它和x/ln x比較接近,所以這個定理是可以用來求乙個區間的素數個數的
Eratosthenes篩法(素數篩)
最一般的素數篩思想很簡單,對於不超過maxx的每個非負整數p,刪除2p,3p,4p,然後剩下的就是素數,複雜度o nlogn 因為對內層迴圈n 2 n 3 n n 小於 1 1 2 1 3 1 n ln n 1 其中 為尤拉常數 0.577218 應當注意,1不是素數哦 這樣已經不慢,但由於所有非素...
Eratosthenes篩法的F 實現
什麼是eratosthenes篩法 考慮乙個常見的數論問題,指定乙個整數,求出不大於該數的所有質數。我們可以先寫乙個函式來判斷某個整數是否為質數,然後用它逐一判斷每個整數,而eratosthenes篩法比這種方法高效得多。下面舉例來說明它的原理。觀察下面的彩圖 來自wikipedia 這裡是檢查12...
篩法求素數 線性篩法求素數
2021年更新版 篩法求素數 線性篩法求素數 要理解篩法求素數首先要知道乙個定理,整數唯一分解定理 任意大於等於2的正整數都有且只有一種方式寫出其質因子的乘積表示式。a p1p2p3p4 pn pi是素數且pi pj eg 2 2 4 22 12 223 36 2233 也就是說任意乙個合數都能分成...