题目: https://www.acwing.com/problem/content/198/
线性筛法只能筛1~n,如果要筛某个区间可以利用线性筛法做个转换
代码大概思路
void get_primes(int n) {
memset (st, 0, sizeof st);
cnt = 0;
for (int i = 2;i <= n;i ++ ) {
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0;primes[j] * i <= n;j ++ ) {
st[primes[j] * i] = 1;
if (i % primes[j] == 0) break;
}
}
}
int main() {
int l, r; // 区间[l, r]
cin >> l >> r;
memset(st, 0, sizeof st);
for (int i = 0;i < cnt;i ++ ) {
int p = primes[i];
for (int j = max(p * 2, (l + p - 1) / p * p);j <= r;j += p) // 要排除p在[l, r]内,所以至少两倍
st[j - l] = 1;
}
cnt = 0; // 重新置零,开始存放[l, r]之间的质数
for (int i = 0;i <= r - l;i ++ )
if (!st[i] && i + l >= 2) // 质数至少>=2
primes[cnt ++ ] = i + l;
}