用合数的最小质因子筛素数,每个数只用筛一次。
代码如下:(筛2~b之间的素数)
for (int i = 2; i <= b; i++)
{
if (p[i]!=1) { prime[pnum] = i; pnum++; }
for (int j = 0; j < pnum; j++)
{
if (i * prime[j] > b) { break; }
else
{
p[i * prime[j]] = 1;
if (i % prime[j] == 0) { break; }
}
}
}
prime是存放素数的数组,pnum是素数个数。
重点在 if (i % prime[j] == 0) { break; } 这一步。下一步j++后prime[j]就不再是最小质因子了,因此结束循环。