演算法之素數篩法

2021-08-25 19:31:52 字數 1500 閱讀 7949

<1>方法一

//判斷是否是乙個素數

int isprime(int a)

//計算列舉上界,為防止double值帶來的精度損失,所以採用根號值取整後再加1,即寧願多列舉乙個,也不願少列舉乙個數

<2>方法二

//判斷是否是乙個素數 mark 標記陣列 index 素數個數

int prime()

else

} }return index;

}

<3>方法三

這種方法比較好理解,初始時,假設全部都是素數,當找到乙個素數時,顯然這個素數乘上另外乙個數之後都是合數

把這些合數都篩掉,即演算法名字的由來。但仔細分析能發現,這種方法會造成重複篩除合數,影響效率。

比如30,在i=2的時候,k=2*15篩了一次;在i=5,k=5*6 的時候又篩了一次。所以,也就有了快速線性篩法。

int mark[maxsize];

int prime[maxsize];

//判斷是否是乙個素數  mark 標記陣列 index 素數個數

int prime()

//標記目前得到的素數的i倍為非素數

for(int j = 0; j < index && prime[j] * i < maxsize; j++)}}

return index;

}

利用了每個合數必有乙個最小素因子。每個合數僅被它的最小素因子篩去正好一次。所以為線性時間。

**中體現在:

if(i%prime[j]==0)break;

prime陣列 中的素數是遞增的,當 i 能整除 prime[j],那麼 i*prime[j+1] 這個合數肯定被 prime[j] 乘以某個數篩掉。

因為i中含有prime[j], prime[j] 比 prime[j+1] 小。接下去的素數同理。所以不用篩下去了。

在滿足i%prme[j]==0這個條件之前以及第一次滿足改條件時,pr[j]必定是pr[j]*i的最小因子。

演算法 素數篩法

素數篩法是acm 及各大比賽中必須熟練掌握的最低階的演算法,在已知某些素數的情況下對未判斷的數進行篩選,篩選掉必然不是素數的數。如何對數進行篩選,依據素數的性質,某個除1以外的正整數是素數,則該數的倍數一定不是素數 從1 10中篩選出所有素數 步驟當前元素12 3456 78910 原始陣列 000...

素數之篩法

本文主要介紹總結一下判定素數過程中使用的兩種篩選方法 eratosthenes篩法 sieve of eratosthenes 和eular篩法 sieve of euler 對,我是來騙訪問量的!o o 素數的倍數一定不是素數 i23 4567 891011 1213 1415 1617 1819...

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...