核心思想:每個質數的倍數都是合數,當發現乙個質數時就將其的倍數都變成合數。
缺點:有的合數會被它的幾個質因子重複篩掉,造成了時間上的浪費。
#include
#include
using
namespace std;
int n, q, cnt, k;
bool isprime[
100000005];
int sushu[
1000005];
voidai(
int n)}}
return;}
intmain()
return0;
}
核心思想:與埃式篩整體大同,但卻能保證每個合數都能被他最大或最小的質因子篩去,從而將時間縮到最短。
#include
using
namespace std;
int n, q, cnt, k;
bool isprime[
100000005];
int sushu[
10005];
void
ola(
int n)
for(
int j=
1;j<=cnt && sushu[j]
*i<=n;j++)}
return;}
intmain()
return0;
}
模板題** 洛谷p3383 埃式篩法 尤拉篩法
埃氏篩法是通過從小到大篩去乙個已知素數的倍數進而實現篩選的。假如我們想篩掉1 100間的所有合數,步驟如下 2是質數,篩掉所有2的倍數 3是質數,篩掉所有3的倍數 4不是質數,跳過 5是質數,篩掉所有5的倍數 6不是質數,跳過 7是質數,篩掉所有7的倍數 8不是質數,跳過 9不是質數,跳過 10不是...
埃氏篩 尤拉篩
對於1 n範圍內素數的查詢,我們常用的二重迴圈暴力演算法的複雜度是o n2 如果利用開根縮小範圍的時間複雜度也無非是在o n nn sqrt n nn 而,這些演算法對於n在105以內都是可以接受的,但是如果需要更大範圍的素數表,這些演算法將顯得力不從心。下面將介紹更加高效的演算法。埃氏篩也叫素數篩...
演算法筆記 素數篩(樸素篩,埃式篩,尤拉篩)
素數也叫質數,是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。如2 3 5 7 11等。素數篩即篩選出1 n內的素數的方法,這裡介紹三種 由上面的概念得,我們可以想到引入乙個從1到它本身的for迴圈,只要中間有取余為0,那麼它就不是素數。define max 100000 int ...