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
函数,如果是绝对素数则输出。