1. 程式人生 > >【 數學基礎】【素數線性篩法--歐拉篩法模板】【普通篩法的優化】

【 數學基礎】【素數線性篩法--歐拉篩法模板】【普通篩法的優化】

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; }

【 數學基礎】【素數線性篩法--歐拉篩法模板】【普通篩法的優化】