时间复杂度O(n),生成的素数紧密存放在prime数组中,primepos是它的元素个数。
注意:if(!(i % prime[j]))保证每个数仅被其最小的质因数筛去,并且保证j不会超过当前已找出的素数的个数。
const int LIM = 1e5 + 10; /* The limit of number to be test */
int prime[LIM / 3];
bool notPrime[LIM];
int primepos;
void eulerLinearMethod() {
int tmp = 0;
memset(notPrime, false, sizeof notPrime);
primepos = 0;
for (int i = 2; i < LIM; i++) {
if (!notPrime[i]) prime[primepos++] = i;
for (int j = 0; (tmp = i * prime[j]) < LIM; j++) {
notPrime[tmp] = true;
if (!(i % prime[j])) break;
}
}
}
Time Complexity: O(n)