int primes[100000];
int num = 0;
bool getPrime(int n){
for(int i = 0; i<100000; i++) isNotPrime[i] = 0;
isNotPrime[1] = true;
for(int i = 2; i<=n; i++){
if(!isNotPrime[i]) primes[num++] = i;
for(int j = 0; j<num; j++){
if(i * primes[j] >= n) break;
isNotPrime[i * primes[j]] = true;
if(i % primes[j] == 0) break;
}
}
}
目的就是为了保证每个合数不被重复筛掉,这是核心
原因:
- 很明显,当i % primes[j] == 0时,primes[j]是i的最小的素因数。
- 若此时不break的话,在后面的循环(内层j的循环)中筛掉的 x = i*primes[k](k>j) 一定含有这个素因数primes[j]。而拿除掉这个最小的素因数primes[j]得到的x/primes[j] 一定是比i大的 (∵primes[k]/primes[j]>1)
- 所以在后面的循环(外层i的循环)中x一定又会被某个更大的i筛掉(这个i就是 x/primes[j])
- 所以要在i % primes[j] == 0时,break,保证后面不会再筛一次