输入n,求1到n的素数个数,给出两种c++编程解法和求解时间以及两种代码中的函数调用关系
时间: 2024-10-19 17:08:57 浏览: 92
求解1到n的素数个数可以采用埃拉托斯特尼筛法(Sieve of Eratosthenes)和质因数分解法。以下是两种C++编程解法:
1. **埃拉托斯特尼筛法**
- 时间复杂度:O(n log log n)
- C++代码示例:
```cpp
#include <iostream>
#include <vector>
int countPrimes(int n) {
std::vector<bool> isPrime(n + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= n; ++i) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i)
isPrime[j] = false;
}
}
return std::count(isPrime.begin(), isPrime.end(), true);
}
// 函数调用关系:main() -> countPrimes()
```
- 函数调用关系:`main()`函数直接调用了`countPrimes`函数并返回结果。
2. **质因数分解法**
- 时间复杂度:O(sqrt(n) * sqrt(n / 2)) 或 O(n^(3/2)),因为对于每个数都要查找它的所有因子
- C++代码示例:
```cpp
#include <iostream>
#include <vector>
int countPrimes(int n) {
int count = 0;
for (int i = 2; i <= n; ++i) {
bool isPrime = true;
for (int j = 2; j * j <= i; ++j) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime)
count++;
}
return count;
}
// 函数调用关系:main() -> countPrimes()
```
在这两种方法中,`main`函数都会调用对应的`countPrimes`函数来计算素数个数。
阅读全文