filter筛选非素数
时间: 2023-06-10 13:09:09 浏览: 82
java筛选不含数字k的素数
筛选非素数的方法有很多,其中一个常用的方法是埃氏筛法(Sieve of Eratosthenes)。
该方法的基本思想是,从2开始,将每个质数的倍数都标记成合数,直到筛子的范围内所有的数都被标记。最后留下的未被标记的数就是质数。
具体实现步骤如下:
1.创建一个长度为n+1的bool数组,表示数字是否为合数,初始值都为false。
2.从2开始,遍历到n的平方根,对于每个质数p,将p的倍数都标记成合数。如果p为质数,则将p的倍数标记成合数的时候,从p * p开始标记。
3.遍历数组,将未被标记的数加入到结果集合中。
C++代码示例:
```c++
vector<int> filterNonPrimes(int n) {
vector<int> res;
vector<bool> isComposite(n + 1, false);
for (int i = 2; i * i <= n; i++) {
if (!isComposite[i]) {
for (int j = i * i; j <= n; j += i) {
isComposite[j] = true;
}
}
}
for (int i = 2; i <= n; i++) {
if (!isComposite[i]) {
res.push_back(i);
}
}
return res;
}
```
该算法的时间复杂度为O(nloglogn),空间复杂度为O(n)。
阅读全文