洛谷-1217 [USACO1.5]回文质数 Prime Palindromes

题目描述
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;
输入输出格式
输入格式:
第 1 行: 二个整数 a 和 b .
输出格式:
输出一个回文质数的列表,一行一个。

输入输出样例
输入样例#1:
5 500

输出样例#1:
5
7
11
101
131
151
181
191
313
353
373
383

解释:我们只要枚举数字的一半就可以,每次枚举出的来数,来判断是否在范围里面和是否为素数

#include<cstdio>
#include<iostream>
using namespace std;
int l=0,r=0;
int exp[103]={1};
int pos(int x){
    int num=0;
    while(x){
        num++;x/=10;
    }
    return num;
}
bool ok(int x){
    if(!(l<=x&&x<=r)) return 0;
    if(x==2) return 1;
    if(x%2==0) return 0;
    for(int i=2;i*i<=x;i++){
        if(x%i==0) return 0;
    }
    return 1;
}
int rever(int x){
    int num=0;
    while(x){
        num=num*10+x%10;
        x/=10;
    }
    return num;
}
int main(){
    for(int i=1;i<=9;i++) exp[i]=exp[i-1]*10;
    cin>>l>>r;
    for(int i=pos(l);i<=pos(r);i++){
        if(i&1){
            for(int j=exp[i/2];j<exp[i/2+1];j++){
                int x=j*exp[i/2]+rever(j/10);
                if(ok(x)) printf("%d\n",x);
            }
        }else{
            for(int j=exp[i/2-1];j<exp[i/2];j++){
                int x=j*exp[i/2]+rever(j);
                if(ok(x)) printf("%d\n",x);
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mkopvec/article/details/90139433