輸出從0
00到1000000
1000000
100000
0的所有質數。
首先0
00和1
11不是質數,從2
22開始逐個判斷是否為質數。如果t
tt為質數,那麼對於任意正整數k
kk,k×t
k \times t
k×t不是質數,因此可以將k×t
k \times t
k×t篩去。如果t
tt已經被篩去,那麼t
tt不是質數,但仍然要將k×t
k \times t
k×t篩去。為了避免重複篩選,需要對篩選條件加以限制,當且僅當k
kk為k×t
k \times t
k×t除了1
11以外的最小因數時將k×t
k \times t
k×t篩去,這樣可以保證每個數最多被篩選1
11次。當k×t
k \times t
k×t被篩去時,k
kk必然為質數,對於t
tt,如果t
tt為質數,那麼k
kk從2
22到t
tt;如果t
tt為合數,那麼k
kk從2
22到t
tt除了1
11以外的最小因數。
o (n
)o(n)
o(n)
#include using namespace std;
#include const int max = 1000000;
int pos; // the amount of prime
int check[max]; // 0 to prime, 1 to composite
int prime[max]; // the prime numbers
/** * @other: 0 and 1 are not prime numbers
*/void prime()
}}
利用篩選得到的質數對n
進行分解質因數。
#include "prime.h"
int count[max]; // the amount of prime numbers
/** * @param n: number n
*/void ext1(int n)
}
#include "ext1.h"
int amount; // the amount of prime factors
int factor[max]; // the prime factors
/** * @param n: number n
*/void ext2(int n)
} if (n > 1) factor[amount++] = n;
}
計算n
所有因數的和。設一共有k
kk種質因數,質因數t
it_i
ti的數量為a
ia_i
ai,那麼因數和為∏i=
1k∑j
=0ai
ti
j\prod^k_ \sum^_ ^j
∏i=1k
∑j=0
ai
tij
。
#include "ext2.h"
/** * @param n: number n
* @return: the sum of factors
*/int ext3(int n)
ans *= sum;
} return ans;
}
ACM演算法 線性篩
應用 判斷是否為素數 第乙個想法 普通優化,對數字加根號遍歷。不夠優秀 第二個想法 如果我們知道乙個數是素數,那麼我們可以將這個素數的倍數篩去。我們從2開始,每次迴圈到乙個數,先判斷它是否被篩過,如果沒有,那麼它肯定是素數,就用它去篩它的倍數,否則就跳過。上述的篩法稱為 複雜度大約為nln n 這個...
尤拉篩法 線性篩
尋找素數是我們剛學迴圈的時候就會遇到的乙個問題,但我們第一時間想到的便是暴力查詢.判斷乙個素數的複雜的就是o n 通過迴圈中值判斷到根號n可以優化一些,不過複雜度也達不到預期.但在數論中,有更完美的方法,埃氏篩法o nlog logn 尤拉篩法o n 思想 從2開始,將每個素數的倍數都標記成合數,用...
質數線性篩法 O n
埃氏篩法o nloglogn 仍會重複標記合數 such as i 2時 12 2 6,先會被 2 標記已是合數 i 3時 12 3 4,又被標記了一次 我們在生成乙個需要標記的合數時,每次只向現有的數中乘上乙個質因子,並且讓它是所生成合數的最小質因子 code include include us...