素數判斷與素數篩選法

2021-10-19 13:48:58 字數 929 閱讀 1012

方法一:直接判斷,思想簡單,實現比較簡單,但是複雜度過高

bool isprime

(int a)

return true;

}

方法二:素數篩選法(eratosthenes 篩法)

只有素數才能當篩子

篩掉對應的倍數,不超過要求的範圍即可

遍歷一遍**

void

getprime

(int n)}}

}//從i*i開始計算 j+=i;

void

getprime2

(int n)

}}

方法三:素數篩選法高階判斷

上述篩法能夠滿足大部分的題目要求,足夠使用,但是如果要更加進準,需要進行優化

如:12 根據方法二功能所述,通過2的倍數篩選過一次,通過3的倍數也篩過一次,其中是有重複的部分,所以可以優化。

數字只用最小的質數進行篩選 ,比如數字12,只有2篩,不採用3,因為2的倍數是6 , 3的倍數是4,,

這樣的方式應該如下,根據倍數進行排除,如果當前元素的倍數是之前的質數的整數倍,那麼後面的就不用判斷。

如:4 是2的倍數, 那麼的後面的質數的4倍一定是可以通過2進行排除的,因為 4 * k == 2 * ( 2 *k),所以排除第乙個元素後,後面不判斷, 直接跳過。

int

getprime

(int n)

} cout <<

"prime"

<< endl;

for(

int i =

0;i <= n;i++)if

(is_prime[i]

) cout << i << endl;

return k;

}

篩選法判斷素數

常規的判斷1 n以內的素數的時間複雜度為o n sqrt n 在n很大的時候時間很長,所以需要別的方法來判斷素數。這裡介紹篩選法。1 申請乙個陣列bool prime n 1 初始化所有的奇數下標為true,偶數下標為false 2例外 2 for int i 3 i sqrt n i 2 3 最後...

素數篩選法

篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...

素數篩選法

素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。int vis maxn for int i 2 i n i for int j i 2 j n j i vis j 1 這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。...