篩法求素數 nyoj

2021-07-14 21:10:07 字數 450 閱讀 2965

求1-max內的一切素數,並輸出,方法有很多這是效率相對比較高的一種;

對於篩法,首先要有一定的了解,首先定義全部為真,然後篩選裡面不滿足條件的;

思路:首先巨集定義  max的範圍,su[max]素數存放,prime[max]判斷素數函式;由於巨集定義的初始值都是0,在第乙個for迴圈裡面判斷,接下來for的巢狀使用將

su[j]的倍數值定義為1,返回時由於第乙個if的判斷不會存入到su[max]裡面,但是要注意su[j]*i的值是否依舊在你所求素數的範圍內;if(i%su[j]==0)將素數倍數排除;

最後輸出su[j],即素數列。

程式如下:

#include #define max 100

int su[max];

int prime[max];

int main()

{int i,j,sum=0;

for(i=2;i

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

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後面第乙個沒劃去的數...