A17037. 革命烈士编号
填空题
中等
知识点
题目描述
革命烈士编号
题目描述
某革命烈士纪念馆为每位烈士分配了一个唯一的编号。现在需要找出在区间 [a, b] 内的所有“红色素数”。一个数被称为“红色素数”,当且仅当:
1. 它是一个素数;
2. 它的各位数字之和也是素数。
输入格式
一行两个整数 a b,表示查询区间。
输出格式
一行若干个整数,表示所有红色素数,按从小到大顺序输出,空格分隔。如果没有则输出 NO。
输入样例1
10 50输出样例1
11 23 29 41 43 47输入样例2
1 20输出样例2
2 3 5 7 11参考答案
#include <bits/stdc++.h>
using namespace std;
// 判断 n 是否为素数
bool isp(int n)
{
if (n < 2) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
// 求 n 的各位数字之和
int sd(int n)
{
int sum = 0;
while (n) {
sum += n % 10;
n /= 10;
}
return sum;
}
int main()
{
int a, b;
cin >> a >> b;
// 先把所有符合条件的红色素数存起来,方便控制空格输出
vector<int> v;
for (int i = a; i <= b; i++) {
if (isp(i) && isp(sd(i))) {
v.push_back(i);
}
}
if (v.empty()) {
cout << "NO";
} else {
for (int i = 0; i < v.size(); i++) {
if (i > 0) cout << " ";
cout << v[i];
}
}
return 0;
}答案解析
枚举区间内每个整数 i:
1. 判断 i 是否为素数;
2. 计算 i 的数位和 s;
3. 判断 s 是否为素数;
4. 两个条件都满足就输出。
上一题
下一题