質數定理:
1~n中質數有n/ln(n)個質數
按順序刪除每個數的倍數,最後剩下的就是質數。
給定乙個正整數n,請你求出1~n中質數的個數。
輸入格式
共一行,包含整數n。
輸出格式
共一行,包含乙個整數,表示1~n中質數的個數。
資料範圍
1≤n≤1061≤n≤106
輸入樣例:
8
輸出樣例:
4
#include #include using namespace std;
const int n = 1000010;
int primes[n], cnt;
bool st[n];
//樸素做法
void get_primes(int n)
}//埃式篩法-o(nloglogn)
void get_primes(int n)
} }//線性篩法-o(n), n = 1e7的時候基本就比埃式篩法快一倍了
//演算法核心:x僅會被其最小質因子篩去
void get_prime(int x)
3 篩質數 質數
篩質數的核心思想 先把所有數放進乙個陣列 然後從前往後看,把每乙個數的倍數刪掉 第乙個數是2,就把所有2的倍數刪掉,4,6,8,10,12 第二個數是3,就把所有3的倍數刪掉,6,9,12 第二個數是4,就把所有4的倍數刪掉,8,12 第二個數是5,就把所有5的倍數刪掉,10 以此類推 這樣篩完之後...
質數中的質數(質數篩法)
如果乙個質數,在質數列表中的編號也是質數,那麼就稱之為質數中的質數。例如 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 的約數,所以我們只需要列舉較小的乙...