3 篩質數 質數

2022-09-16 14:30:12 字數 2035 閱讀 2446

篩質數的核心思想:

先把所有數放進乙個陣列

然後從前往後看,把每乙個數的倍數刪掉

第乙個數是2,就把所有2的倍數刪掉,4,6,8,10,12

第二個數是3,就把所有3的倍數刪掉,6,9,12

第二個數是4,就把所有4的倍數刪掉,8,12

第二個數是5,就把所有5的倍數刪掉,10

以此類推

這樣篩完之後,所有剩下的數就是質數

證明:對於任何乙個數p而言,如果p沒有被刪掉的話,就意味著從2到p - 1中的任何乙個數,都沒有把p刪掉

說明p不是2到p - 1中間任何乙個數的倍數,也即2到p - 1中間不存在p的約數,所以p是乙個質數

質數定理:1 ~ n中,有n / ln (n)個質數

線性篩:

//再把每乙個數的倍數刪掉

13for (int j = i + i; j <= n; j += i) 16}

17}18void get_primes_2(int

n) 26}27

//並不需要把每乙個數的倍數刪掉,只把所有質數的倍數刪掉就可以了

28//

可以把迴圈放進判斷裡面去29}

30}31void get_primes_3(int

n) 41

//從小到大列舉所有質數

42for (int j = 0; primes[j] <= n / i; j++) 47}

48}49}

50/*

51當n = 1e6時,埃氏篩法和線性篩法執行時間差不多

52當n = 1e7時,線性篩法比埃氏篩法快一倍

53*/

54int

main()

2023年8月2日複習更新,果然複習之後之前不明白的地方就容易明白了線性篩法裡,42行primes[j] <= n / i,是

primes[j] * i <= n的變形,防止越界

然後把

primes[j] * i篩掉

然後我終於看明白別人的題解了

質數 篩質數

質數定理 1 n中質數有n ln n 個質數 按順序刪除每個數的倍數,最後剩下的就是質數。給定乙個正整數n,請你求出1 n中質數的個數。輸入格式 共一行,包含整數n。輸出格式 共一行,包含乙個整數,表示1 n中質數的個數。資料範圍 1 n 1061 n 106 輸入樣例 8輸出樣例 4 includ...

質數中的質數(質數篩法)

如果乙個質數,在質數列表中的編號也是質數,那麼就稱之為質數中的質數。例如 3 5分別是排第2和第3的質數,所以他們是質數中的質數。現在給出乙個數n,求 n的最小的質數中的質數是多少 可以考慮用質數篩法來做 input 輸入乙個數n n 10 6 output 輸出 n的最小的質數中的質數。input...

判斷質數與篩質數

一 判定質數 要判斷乙個數是不是質數,只需遍歷小於等於它的所有數,如果它能被除了1和本身之外的數整除,那麼它就不是質數。很簡單,暴力列舉,如下 1 bool is prime intx 2 但是還可以優化,對於乙個數 x 它有乙個約數 d 那麼 frac 也是 x 的約數,所以我們只需要列舉較小的乙...