篩法求素數

2022-03-01 08:17:53 字數 861 閱讀 2672

判斷素數的方法很簡單:

1

int is_yes(intx)2

10return1;

11 }

然而有很多數的時候 ,很顯然,如果從頭選到尾,是非常耗費時間的。

所以用這個方法寫的時候就顯出了優勢,就是省時。

先從小到大排序,把從1開始的、某一範圍內的正整數從小到大順序排列, 1不是素數,首先把它篩掉。剩下的數中選擇最小的數是素數,然後去掉它的倍數。依次類推,直到篩子為空時結束。

int a[mxan];

void is_yes()

} }}//所有的非素數標記為1,素數都標記為0

素數:只有1和自身兩個約數的正整數.

一般通過定義來進行判斷的話,可以直接來判斷乙個數字是否為素數。但是期複雜度是o(n*sqrt(n))。很顯然,這個的效率非常低。

-------------------------------下面是一種較為高效的演算法------------------------------------

具體的實現:將1-n個自然數一次排序。1不是質數也不是合數,要划去。第二個數是2,2是質數留下來,而把2後面能被2整除的所有整數都劃去。2後面的3沒有劃去,3是質數,把3留下,再把3後面的所有能被3整除的數劃去,以此類推,,,每次都把沒有去掉的數的後面的能被該數整除的數都劃去。然後將沒劃去的數記錄下來。

演算法實現:

1 #define max 1000000

2 intprime[max];

3 4 voidisprime()

5 17 }

18 }

其實還有其他好幾種方法,可能更高效,參加下面大佬的部落格:

篩法求素數 線性篩法求素數

2021年更新版 篩法求素數 線性篩法求素數 要理解篩法求素數首先要知道乙個定理,整數唯一分解定理 任意大於等於2的正整數都有且只有一種方式寫出其質因子的乘積表示式。a p1p2p3p4 pn pi是素數且pi pj eg 2 2 4 22 12 223 36 2233 也就是說任意乙個合數都能分成...

素數篩法求素數

素數篩類似於打表標記,預先處理掉非素數的數,即素數的倍數 任意非素數都可以由幾個素數相乘得到 於是效率比暴力求解快得多。埃氏篩法的效率為o n loglog n 簡單易懂,但是會重複標記,比如當i為2時,6會被標記掉,然而當i為3時,6又會被重複標記,這樣的重複訪問加大了時間複雜度,於是有了尤拉篩。...

篩法求素數

素數篩法就是每次把已知的素數的倍數曬去,篩掉前sqrt n 中素數的倍數就可以了 先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第乙個沒劃去的數...