测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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. 两个条件都满足就输出。

上一题 下一题