题目
思路
构造回文数,再判断是否为素数。
方法
构造回文数
产生长度为5的回文数
for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
for (d2 = 0; d2 <= 9; d2++) {
for (d3 = 0; d3 <= 9; d3++) {
palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
}
}
}
减少范围的要点:
- 1位回文素数只有5,7;2位回文素数只有11 。
- 偶数长度的回文数一定能被11整除,所以除了11本身,其他偶数长度的回文数都不是素数。
判断是否为素数
bool isPrime(int n) {
for(int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
C++代码实现
/**
* 求一个区间内的回文素数,暴力解法
*/
#include <iostream>
using namespace std;
int isPrime(int n);
int main() {
int a, b;
cin >> a >> b;
int palindrome;
while (a) {
// 枚举 1 位和 2 位的回文素数
for (int i = 5; i < 12 && a < 12; i += 2 ) {
if (i >= a && i <= b && isPrime(i))
cout << i << endl;
}
// 枚举 3 位的回文素数
for (int i = 1; i < 10 && a < 1000; i+=2) {
for (int j = 0; j < 10; j++) {
palindrome = i * 100 + j * 10 + i;
if (palindrome >= a && palindrome <= b && isPrime(palindrome)) {
cout << palindrome << endl;
}
if (palindrome >= b) {
goto exit;
}
}
}
// 5
for (int d1 = 1; d1 <= 9 && a < 100000; d1+=2) {
for (int d2 = 0; d2 <= 9; d2++) {
for (int d3 = 0; d3 <= 9; d3++) {
palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;
if (palindrome >= a && palindrome <= b && isPrime(palindrome)) {
cout << palindrome << endl;
}
if (palindrome >= b) {
goto exit;
}
}
}
}
// 7
for (int d1 = 1; d1 <= 9; d1+=2) {
for (int d2 = 0; d2 <= 9; d2++) {
for (int d3 = 0; d3 <= 9; d3++) {
for (int d4 = 0; d4 <= 9; d4++) {
palindrome = 1000000*d1 + 100000*d2 +10000*d3 + 1000*d4 + 100*d3 + 10*d2 + d1;
if (palindrome >= a && palindrome <= b && isPrime(palindrome)) {
cout << palindrome << endl;
}
if (palindrome >= b) {
goto exit;
}
}
}
}
}
exit:
cin >> a >> b;
}
return 0;
}
int isPrime(int n) {
for(int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}