<1>方法一
<3>方法三//判斷是否是乙個素數
int isprime(int a)
//計算列舉上界,為防止double值帶來的精度損失,所以採用根號值取整後再加1,即寧願多列舉乙個,也不願少列舉乙個數
<2>方法二
//判斷是否是乙個素數 mark 標記陣列 index 素數個數
int prime()
else
} }return index;
}
這種方法比較好理解,初始時,假設全部都是素數,當找到乙個素數時,顯然這個素數乘上另外乙個數之後都是合數
把這些合數都篩掉,即演算法名字的由來。但仔細分析能發現,這種方法會造成重複篩除合數,影響效率。
比如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的所有倍數都是合數...