题目描述
定义两个相差为 2 的素数称为素数对,如 5 和 7、17 和 19 等。给定一个正整数 n,要求找出所有两个数均不大于 n 的素数对。
输入格式
一个正整数 n。1 ≤ n ≤ 10000。
输出格式
所有小于等于 n 的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出 empty。
样例输入
10
样例输出
3 5
5 7
参考实现
这道题的核心在于高效地判断素数并遍历查找。由于 n 的范围较小(最大 10000),直接对每个数进行试除法判断即可满足时间要求。我们先用一个布尔数组标记出范围内的所有素数,然后依次检查相邻差值为 2 的组合。
注意数组下标越界的问题,虽然全局变量默认初始化为 0,但逻辑上最好确保只访问有效范围。另外,如果没有找到任何素数对,需要按题目要求输出 empty。
#include <bits/stdc++.h>
using namespace std;
int n;
bool b[10005]; // 标记素数的数组,默认为 false
bool f = false; // 标记是否找到孪生素数对
// 判断 x 是否是素数
bool isPrime(int x) {
if (x < 2) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
int main() {
cin >> n;
// 步骤 1: 标记 2 到 n 之间的所有素数
for (int i = 2; i <= n; i++) {
((i)) {
b[i] = ;
}
}
( i = ; i <= n; i++) {
(b[i] && b[i + ]) {
cout << i << << i + << endl;
f = ;
}
}
(!f) {
cout << ;
}
;
}


