代码
筛 n 以内的所有素数
for(int i = 2; i <= n ;i ++){
if(!st[i])
primes[cnt ++ ] = i;
for (int j = 0; primes[j] * i <= n; j ++ ){
st[i * primes[j]] = true;
if(i % primes[j] == 0)
break;
}
}
几点需要理解的地方
1. 内循环条件判断的含义
从i开始,向后将以i为因数的数筛出来,这些数一定不是素数。
由于只需要求 n 以内素数,因此primes[j] * i
筛选到n即可,若primes[j] * i
远小于 n ,通过下面的 if 判断语句,一定能够跳出循环(无论质数还是合数,必有质因数,质数的最小质因数为其本身)。
2. 为什么要有 if(i % primes[j] == 0) break; 这句话
根据第一条的讨论,当与 i 相乘的该素数为 i 的最小的质因数,则跳出循环。
举个例子:
i = 9
则 primes[ j ] 最大到 3 就跳出循环了。也就是后面最大将 st[ 27 ] 置为true(合数)
那么后面的不需要筛选了吗?
假设当前循环没有跳出, primes[ j ] 成为了 5 ,那么
因为 45 = 5 * 9 = 3 * 3 * 5 = 3 * 5 = 45,当 i 循环到15的时候还会再被筛选一遍。
这样便减少了筛选的次数。