请用C++代码筛出2~1e7中所以质数(线性,并且用一个1e7的数组记录每个数字是否为质数)
时间: 2023-11-28 10:51:22 浏览: 34
以下是使用线性筛法的C++代码,时间复杂度为O(n):
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 10000000;
bool is_prime[MAXN + 1];
int primes[MAXN + 1], prime_cnt;
void sieve() {
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= MAXN; i++) {
if (is_prime[i]) primes[++prime_cnt] = i;
for (int j = 1; j <= prime_cnt && i * primes[j] <= MAXN; j++) {
is_prime[i * primes[j]] = false;
if (i % primes[j] == 0) break;
}
}
}
int main() {
sieve();
// 输出所有质数
for (int i = 2; i <= MAXN; i++) {
if (is_prime[i]) cout << i << " ";
}
return 0;
}
```
其中,is_prime数组记录每个数字是否为质数,primes数组记录筛出的所有质数,prime_cnt记录质数的个数。
在sieve函数中,首先将is_prime数组全部初始化为true,然后从2开始枚举每个数,如果这个数是质数,则将其加入primes数组中,并且将其倍数标记为非质数。具体地,对于第i个质数primes[j],从i * primes[j]开始,将其标记为非质数,如果i是primes[j]的倍数,则退出循环。
最后,在主函数中输出所有质数。