记录欧式筛法筛选素数

发布时间 2023-04-03 22:13:21作者: Besnnad
点击查看代码
void getPrime(long long n, vector<int>& prime, vector<bool>& isPrime) {
    isPrime[1] = false;
    for (int i = 2; i < n; ++i) {
        if (isPrime[i]) {
            prime.emplace_back(i);
        }
        for (const int& p : prime) {
            if (p * i > n) break;
            isPrime[p*i] = false;
            if (i % p == 0) break;
        }
    }
    return;
}

n:isPrime 数组的大小
prime:待生成的素数向量
isPrime:已经分配好空间的 bool 向量,表示是否是素数


流程:

  1. 如果是素数的话,加入到 prime 中
  2. 无论当前是否是素数,都将对当前的 prime 数组进行遍历,将 prime[j] * i 设置成 false,直至 i % prime[j] == 0 为止

时间复杂度为 O(N)