编写一个程序exp1-3.cpp,求1~n的素数个数。给出两种解法,对于相同的n,给出这两种解法的结果和求解时间,并用相关数据进行测试。
时间: 2024-09-12 21:05:05 浏览: 50
编写一个程序来计算1到n之间的素数个数是一个常见的编程任务,这里提供两种不同的方法来解决这个问题。
第一种解法是经典的埃拉托斯特尼筛法(Sieve of Eratosthenes),该算法对于不是非常大的n效率较高。第二种解法是基于判断每一个数是否为素数的简单方法,适合小规模的n值。
解法一:埃拉托斯特尼筛法(Sieve of Eratosthenes)
```cpp
#include <iostream>
#include <vector>
#include <chrono>
int countPrimes(int n) {
std::vector<bool> prime(n + 1, true);
int count = 0;
for (int p = 2; p * p <= n; p++) {
if (prime[p]) {
for (int i = p * p; i <= n; i += p) {
prime[i] = false;
}
}
}
for (int p = 2; p <= n; p++) {
if (prime[p]) {
++count;
}
}
return count;
}
int main() {
int n;
std::cout << "请输入n的值: ";
std::cin >> n;
auto start = std::chrono::high_resolution_clock::now();
int result1 = countPrimes(n);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "素数个数: " << result1 << ",程序运行时间: " << diff.count() << "秒" << std::endl;
return 0;
}
```
解法二:简单判断每个数是否为素数
```cpp
#include <iostream>
#include <chrono>
bool isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) return false;
}
return true;
}
int countPrimesSimple(int n) {
int count = 0;
for (int i = 2; i <= n; i++) {
if (isPrime(i)) {
++count;
}
}
return count;
}
int main() {
int n;
std::cout << "请输入n的值: ";
std::cin >> n;
auto start = std::chrono::high_resolution_clock::now();
int result2 = countPrimesSimple(n);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "素数个数: " << result2 << ",程序运行时间: " << diff.count() << "秒" << std::endl;
return 0;
}
```
为了比较这两种方法的结果和求解时间,你可以使用一系列不同的n值进行测试。注意,由于测试环境和系统配置的不同,程序运行时间可能会有所不同。
阅读全文