题目描述

zls对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在chshru想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。$(5 <= a < b <= 100,000,000)$; 

输入

这里有许多组数据,每组包括两组数据a跟b。

输出

对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。

样例输入

5 500

样例输出

5
7
11
101
131
151
181
191
313
353
373
383

题解

#include <stdio.h>
#include <string.h>
#define Max 10000000
bool isPrime[Max];
int a[1000];
int n;
void getPrime() {
    memset(isPrime, true, sizeof(isPrime));
    for (int i = 2; i < Max; i++) {
        if (isPrime[i]) {
            for (int j = i + i; j < Max; j += i)
                isPrime[j] = false;
        }
    }
}
bool isPalindrome(int x) {
    int y = 0, temp = x;
    while (x) {
        y = y * 10 + x % 10;
        x /= 10;
    }
    return temp == y;
}
void creatPP() {
    n = 0;
    getPrime();
    a[n++] = 2;
    for (int i = 3; i < Max; i += 2) {
        if (isPrime[i] && isPalindrome(i))
            a[n++] = i;
    }
}
int main() {
    int x, y;
    creatPP();
    while (~scanf("%d %d", &x, &y)) {
        for (int i = 0; i < n; i++) {
            if (a[i] < x)
                continue;
            else if (a[i] > y)
                break;
            else
                printf("%d\n", a[i]);
        }
        printf("\n");
    }
    return 0;
}