Description

The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 100,000,000); both a and b are considered to be within the range .

Input

There are multiple test cases.

Each case contains two integers, a and b.

a=b=0 indicates the end of input.

Output

For each test case, output the list of palindromic primes in numerical order, one per line.

 

Sample Input
4190. Prime Palindromes 一亿以内的质数回文数 Copy sample input to clipboard
5 500
0 0
Sample Output
5
7
11
101
131
151
181
191
313
353
373
383



题目链接:4190. Prime Palindromes
题意分析:求给定区间内的质数回文数
题目分析:
1.多组测试数据,所以先打表。
2.先求质数再判断回文,效率低下;所以先构造回文数,再判断质数。
3.偶数位的回文数都能被11整除,自己证明去。所以,偶数位的回文数除了11都是合数。
4.一个k位数,可以构造出一个奇数位的回文数。比如13,可以构造131;189可以构造18981.所以100000000内的只要从1构造到9999即可。
5.若范围为1000000000,那么明显超出int范围,要用long long。当然此题无此陷阱。

//http://soj.me/show_problem.php?pid=4190
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

vector<int> v;

bool prime(int x)
{
    for (int i = 2; i < sqrt(x+0.5); i++)
        if (x%i == 0)
            return 0;
        
    return 1;
}

void get()
{
    // 11是唯一的偶数位的质数回文数。
    v.push_back(11);
    
    //构造奇数位的回文数
    for (int i = 2; i <= 10000; ++i)
    {
        int tmp = i/10, sum;
        
        for (sum = i; tmp != 0; tmp /= 10)
        {
            sum = sum*10 + tmp%10;
        }
        
        if (prime(sum))
            v.push_back(sum);
    }
}
int main()
{
    get();
    sort(v.begin(), v.end());    //因为是不按顺序push,所以要sort
    int a, b;
    while(cin >> a >> b, a||b)
    {
        for (int i = 0; i < v.size(); ++i)
        {
            if (v[i] >= a)
            {
                if (v[i] > b)
                    break;
                
                printf("%d\n", v[i]);
            }
        }
    }
}
View Code

 

相关文章: