C++ 从任意n个数中找出素数,求素数的和,并将这些素数按小到大的顺序排序
时间: 2024-10-25 07:15:57 浏览: 70
C++ 实现求小于n的最大素数的实例
5星 · 资源好评率100%
在C++中,寻找一组数字中的素数并计算其和、排序,可以采用埃拉托斯特尼筛法(Sieve of Eratosthenes)作为基础算法。以下是步骤:
1. **创建一个布尔数组**:用于标记每个数字是否为素数,初始所有元素都设为true,除了0和1。
2. **埃拉托斯特尼筛法**:
- 从第一个质数(2)开始,将它的倍数标记为非素数。
- 找到下一个未被标记的数字,它是新的质数,重复上述过程直到筛子的最大值(即输入数组的最大值)。
3. **筛选出素数**:遍历布尔数组,将所有值为true的位置对应的数字添加到素数列表中。
4. **计算素数之和**:对素数列表中的数字求和。
5. **排序素数**:可以使用`std::sort`函数对素数列表进行从小到大的排序。
下面是伪代码示例:
```cpp
#include <vector>
#include <algorithm>
bool isPrime(int n) {
if (n <= 1)
return false;
for (int i = 2; i * i <= n; ++i)
if (n % i == 0)
return false;
return true;
}
void findPrimesSumAndSort(const std::vector<int>& numbers, std::vector<int>& primes) {
// 初始化素数标志
std::vector<bool> isComposite(numbers.size(), false);
// 筛选素数
for (int i = 2; i * i <= numbers.back(); ++i) {
if (isPrime(i)) {
for (int j = i * i; j <= numbers.back(); j += i)
isComposite[j] = true;
}
}
// 提取素数、计算和、排序
int primeSum = 0;
for (size_t i = 0; i < numbers.size(); ++i) {
if (!isComposite[i]) {
primes.push_back(numbers[i]);
primeSum += numbers[i];
}
}
std::sort(primes.begin(), primes.end());
}
// 使用示例
int main() {
std::vector<int> numbers = {2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> primes;
findPrimesSumAndSort(numbers, primes);
// 输出结果
for (const auto& p : primes) {
std::cout << p << " ";
}
std::cout << "\nPrime sum: " << primeSum << "\n";
return 0;
}
```
阅读全文