c++给定一个变量n,筛选法求n以内所有素数,时间控制在50ms之内
时间: 2024-12-13 12:23:57 浏览: 24
c++完成求两千以内的素数
在 C++ 中,可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来求解这个问题,这是一种高效的算法,可以在 O(n log log n) 的时间内找出 n 以内的所有素数。以下是简单的步骤:
1. 初始化一个大小为 n+1 的布尔数组 isPrime[],将所有元素设为 true,表示从 2 到 n 都可能是素数。
2. 从 2 开始遍历数组,因为每个素数都可以整除它之后的所有偶数(除了2),所以将 isPrime[2] 设为 false,并将其倍数(4、6...)标记为非素数。
3. 继续找到下一个小于等于 sqrt(n) 的素数(比如 sqrt(25) = 5),将它的倍数都标记为非素数。
4. 重复步骤 3 直到 sqrt(n),因为大于 sqrt(n) 的因子肯定已经在之前的步子里处理过了。
5. 最后,isPrime 数组中值为 true 的索引就是对应的素数。
下面是 C++ 代码示例:
```cpp
#include <iostream>
#include <cmath>
using namespace std;
void sieveOfEratosthenes(int n) {
bool isPrime[n + 1];
fill(isPrime, isPrime + n + 1, true);
isPrime[0] = isPrime[1] = false; // 0 and 1 are not primes
for (int p = 2; p * p <= n; ++p) {
if (isPrime[p]) {
for (int i = p * p; i <= n; i += p)
isPrime[i] = false;
}
}
// Print all prime numbers
for (int p = 2; p <= n; p++)
if (isPrime[p])
cout << p << " ";
}
int main() {
int n;
cout << "Enter a number: ";
cin >> n;
sieveOfEratosthenes(n);
return 0;
}
```
为了确保时间限制在 50 ms 内,你需要考虑优化代码并尽可能减少不必要的计算,同时利用现代 C++编译器的性能优势。运行这个程序时,请确保输入的 n 不会过大,以免超出内存限制。
阅读全文