埃式筛法相对于朴素筛法是用素数来筛掉合数,但是这样也会重复计算多次,例如2 * 10 = 20, 5 * 4 = 20,当数据量较大的时候,重复计算的次数也会过多,所以线性筛法就很好的避免了这个问题,线性筛法的核心是每个合数只会被它的最小质因数筛掉,这样就会避免重复计算,很好的节约时间
线性筛法的核心代码如下:
for(int i = 2; i <= n; i ++) // 线性筛法:每个数只会被它的最小质因数筛掉
{
if(!st[i]) primes[cnt++] = i;
for(int j = 0; primes[j] <= n / i; j ++)
{
st[i * primes[j]] = true;
cout << primes[j] << ' ' << i << ' ' << i * primes[j] << endl;
if(i % primes[j] == 0) break; // 这里假设当 i % primes[j] == 0时没有break掉,那么接着会去筛掉i * primes[j + 1]
} // 因为primes[j]是i的最小质因子,所以i = primes[j] * k, 设x = primes[j + 1] * i =
// primes[j + 1] * primes[j] * k, 所以此时筛掉x的primes[j + 1] 就不是x的最小质因数
// primes[j]才是,所以对于x这个数,我一定可以在后面的循环中用一个更大的数ii * primes[j]
// 来筛掉x,所以当i % primes[j] == 0时,我应该break掉,避免重复筛.
}