【 數學基礎】【素數線性篩法--歐拉篩法模板】【普通篩法的優化】
阿新 • • 發佈:2017-08-19
for ++ 自身 素數 spa prime pri 沒有 大於
質數(素數):指大於1的所有自然數中,除了1和自身,不能被其它自然數整除的數
合數:比1大,但不是素數的數稱為合數,合數除了被1和自身整除,還能被其它數整除
質因數(素因數或質因子):能整除給定正整數的質數,除1以外,兩個沒有其它共同質因子的正整數稱為互質
1和0既非素數又非合數
素數篩法原理:素數的倍數一定不是素數。
實現步驟:用一個boook數組對maxn內的所有數進行標記,1為合數,0為素數,book初始化為0是假設全部數都為素數,從第一個素數2開始,把2的倍數標記為1,然後繼續下一輪
歐拉篩法與普通篩法比較,優化之處在於每個合數不會被重復標記,時間復雜度和空間復雜度均為o(n)
#define maxn 100005 #define maxl 1299710 int prime[maxn],book[maxl]; void prime() { int i,sum=0,j; memset(book,0,sizeof(book)); for(i = 2; i < 2500000; i ++) { if(!book[i]) prime[sum++] = i; for(j = 0; j < sum; j ++)//保證合數只會被它的最小質因數篩去 ,因此每個數只會被篩去一次 {if(i*prime[j] >= maxl) break; book[i*prime[j]] = 1; if(i%prime[j] == 0) break; } } return; }
【 數學基礎】【素數線性篩法--歐拉篩法模板】【普通篩法的優化】