篩質數的核心思想:
先把所有數放進乙個陣列
然後從前往後看,把每乙個數的倍數刪掉
第乙個數是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 的約數,所以我們只需要列舉較小的乙...