求1~n的所有质数
cnt是质数的个数,质数存储在p数组中,st数组用来标记数i是否为质数
void get_prime()
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i])
p[cnt ++ ] = i;
for (int j = 0; i * p[j] <= n; j ++ )
{
st[i * p[j]] = true;
if (i % p[j] == 0) break;
}
}
}
思路
按顺序遍历所有数,若当前数未被标记,为质数
保证所有合数均被其最小质因子筛掉
从小到大遍历所有质数,意图筛掉p[j] * i
当i % p[j] != 0
时,说明p[j]
不是i
的最小质因子,故p[j] * i
的最小质因子是p[j]
,可以筛掉
当i % p[j] == 0
时,说明p[j]
是i
的最小质因子,故p[j] * i
的最小质因子也是p[j]
,可以筛掉
但此时若继续循环,用p[j + 1]
筛p[j + 1] * i
时,其最小质因子就不是p[j]
了,因为i
有最小质因子p[j]
,而p[j]
小于p[j + 1]
。此时应该退出循环,防止重复筛选。