B3939 [GESP样题 四级] 绝对素数
题目
如果一个两位数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如 13。给定两个正整数 A, B,请求出大于等于 A,小于等于 B 的所有绝对素数。
输入 1 行,包含两个正整数 A 和 B。保证 10<A<B<100。
若干行,每行一个绝对素数,从小到大输出。
运行代码
#include <iostream>
using namespace std;
bool Prime(int num);
bool APrime(int num);
int main() {
int A, B;
cin >> A >> B;
// 遍历从A到B之间的所有数
for (int num = A; num <= B; ++num) {
if (APrime(num)) {
cout << num << endl;
}
}
return 0;
}
// 判断一个数是否为素数
bool Prime(int num) {
if (num <= 1)
return false;
if (num <= 3)
return true;
if (num % 2 == 0 || num % 3 == 0)
return false;
for (int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0)
return false;
}
return true;
}
// 判断一个两位数是否为绝对素数
bool APrime(int num) {
if (num < 10 || num >= 100)
return false; // 确保是两位数
int rNum = (num / 10) + (num % 10) * 10; // 反转数字
return Prime(num) && Prime(rNum);
}
思路
首先定义了Prime
函数来判断一个数是否为素数,使用了一种常见的优化后的试除法。然后定义了APrime
函数,它首先检查给定的数是否为两位数,接着计算该数的反转数,并利用Prime
函数判断原数及其反转数是否均为素数。最后,在main
函数中,程序读取输入的范围A
和B
,遍历此范围内的所有数,对于每个数调用APrime
函数,如果是绝对素数则输出。