筛选法寻找100以内的质数C++
时间: 2023-07-09 19:11:59 浏览: 165
以下是使用筛选法寻找100以内的质数的C++代码:
```c++
#include <iostream>
using namespace std;
int main()
{
bool prime[101];
memset(prime, true, sizeof(prime)); //初始化为true
for (int p = 2; p * p <= 100; p++) {
if (prime[p] == true) {
for (int i = p * p; i <= 100; i += p)
prime[i] = false; //将p的倍数标记为false
}
}
cout << "100以内的质数有:";
for (int p = 2; p <= 100; p++) {
if (prime[p])
cout << p << " ";
}
cout << endl;
return 0;
}
```
输出结果为:
```
100以内的质数有:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
```
相关问题
c++筛选法求n以内素数
在 C++ 中,筛选法(Sieve of Eratosthenes)是一种常见的求解 n 以内素数的经典算法。这种算法基于筛除法的思想,主要用于寻找小于等于给定数值的所有质数。以下是基本的步骤:
1. 创建一个布尔数组,大小为 n+1,初始所有元素都标记为 true,表示它们都是潜在的质数。
2. 从 2 开始(最小的质数),遍历这个数组,将每个素数的倍数都标记为 false,因为它们不是质数。例如,2 的倍数就是 4, 6, 8, ... 等,3 的倍数是 6, 9, 12, ... 等。
3. 遍历结束后,数组中仍然为 true 的位置对应的数字就是素数。
下面是一个简单的 C++ 实现示例:
```cpp
#include <iostream>
#include <vector>
std::vector<int> sieveOfEratosthenes(int n) {
std::vector<bool> isPrime(n + 1, true); // 假设所有数都是质数
isPrime[0] = isPrime[1] = false; // 0 和 1 不是质数
for (int i = 2; i * i <= n; ++i) { // 只需检查到√n
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i)
isPrime[j] = false;
}
}
// 收集所有的质数
std::vector<int> primes;
for (int i = 2; i <= n; ++i)
if (isPrime[i])
primes.push_back(i);
return primes;
}
int main() {
int n;
std::cout << "Enter a number: ";
std::cin >> n;
std::vector<int> primeNumbers = sieveOfEratosthenes(n);
std::cout << "Primes less than or equal to " << n << ": ";
for (const auto& prime : primeNumbers)
std::cout << prime << " ";
std::cout << "\n";
return 0;
}
```
完美质数,即一个数本身是质数,它的各位和也是质数,求n以内完美质数的个数,以c++形式写出来
在C++中,寻找完美质数(既是质数又是其除1和本身以外的所有数字之和的质数)是一个更为复杂的任务,因为它涉及到同时对质数性和完美数性的判断。这里我们可以结合已有的质数判定算法,并添加一个额外的步骤来检查每一位的和是否也是质数。
以下是简化的C++代码示例,采用了埃拉托斯特尼筛法(Sieve of Eratosthenes)先找出一定范围内的质数,然后逐一检测它们的各位数字和是否仍为质数:
```cpp
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
// 判断一个数是否为质数
bool is_prime(int num) {
if (num <= 1) return false;
if (num == 2 || num == 3) return true;
if (num % 2 == 0 || num % 3 == 0) return false;
int i = 5;
while (i * i <= num) {
if (num % i == 0 || num % (i + 2) == 0)
return false;
i += 6;
}
return true;
}
// 检查一个数的所有位和是否为质数
bool is_perfect_digit_sum(int num) {
bitset<10> digit_sums(0);
while (num > 0) {
digit_sums.set(num % 10);
num /= 10;
}
for (size_t i = 1; i < digit_sums.size(); ++i) {
if (digit_sums[i] && is_prime(i)) {
return false;
}
}
return digit_sums.count() == 1 && digit_sums.test(1); // 1不是质数,但它是唯一一位数字的完美数
}
int count_perfect_powersum_primes(int n) {
vector<int> primes;
for (int i = 2; i <= n; ++i) {
if (is_prime(i)) {
primes.push_back(i);
}
}
int perfect_power_sums_count = 0;
for (const auto &prime : primes) {
if (is_perfect_digit_sum(prime)) {
perfect_power_sums_count++;
}
}
return perfect_power_sums_count;
}
int main() {
int limit;
cout << "请输入一个整数n:";
cin >> limit;
cout << "在" << limit << "以内的完美质数的个数有:" << count_perfect_powersum_primes(limit) << endl;
return 0;
}
```
这段代码首先筛选出小于等于n的质数,然后遍历这些质数,检查它们的数字和是否为质数。如果是,则计数加1。
阅读全文
相关推荐












