分析:由于数据已经大于10的5次方,我们不能打表,所以,只能先暴力枚举出所有回文数,然后再判断是否为素数
Code:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int pri[10000];
int cnt;
bool isPrime(int n) {
int sqr = sqrt(n*1.0);
for(int i = 2; i <= sqr; i++)
if(n%i == 0) return false;
return true;
}
void three() {
for(int d1 = 1; d1 <= 9; d1 += 2)
for(int d2 = 0; d2 <= 9; d2++) {
int pp = d1*100 + d2*10 + d1;
if(isPrime(pp))
pri[cnt++] = pp;
}
}
void four() {
for(int d1 = 1; d1 <= 9; d1 += 2)
for(int d2 = 1; d2 <= 9; d2++) {
int pp = d1*1000 + d2*100 + d2*10+ d1;
if(isPrime(pp))
pri[cnt++] = pp;
}
}
void five() {
for(int d1 = 1; d1 <= 9; d1 += 2)
for(int d2 = 0; d2 <= 9; d2++)
for(int d3 = 0; d3 <= 9; d3++){
int pp = d1*10000 + d2*1000 + d3*100 + d2*10 + d1;
if(isPrime(pp))
pri[cnt++] = pp;
}
}
void six() {
for(int d1 = 1; d1 <= 9; d1 += 2)
for(int d2 = 0; d2 <= 9; d2++)
for(int d3 = 0; d3 <= 9; d3++){
int pp = d1*100000 + d2*10000 + d3*1000 + d3*100 + d2*10 + d1;
if(isPrime(pp))
pri[cnt++] = pp;
}
}
void seven() {
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++) {
int pp = d1*1000000 + d2*100000 + d3*10000 + d4*1000 + d3*100 + d2*10 + d1;
if(isPrime(pp))
pri[cnt++] = pp;
}
}
void eight() {
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++) {
int pp = d1*10000000 + d2*1000000 + d3*100000 + d4*10000 + d4*1000 + d3*100 + d2*10 + d1;
if(isPrime(pp))
pri[cnt++] = pp;
}
}
int main() {
int a, b;
cnt = 0;
pri[cnt++] = 5;
pri[cnt++] = 7;
pri[cnt++] = 11;
three();
four();
five();
six();
seven();
eight();
while(~scanf("%d%d", &a, &b)) {
for(int i = 0; i < cnt; i++) {
if(pri[i] > b) break;
if(pri[i] >= a && pri[i] <= b)
printf("%d\n", pri[i]);
}
}
return 0;
}