题目链接:https://www.luogu.org/problemnew/show/P1217

说起来你可能不信,这是洛谷新手村的一道题目…1e9这么大数据吓了我一跳

我刚开始看这题还以为要写素数筛,后来看了一下说明,woc!直接枚举个位数、十位数、百位数生成回文数再判断 (我怎么开始就没想到)


AC代码略长,思路很简单。

#include <bits/stdc++.h>
using namespace std;
int a,b,s,cnt,pos[1010];//pos记录回文质数
bool judge(int x)//没错,只需要这种最朴素的判断素数函数,欧拉线性素数筛都不需要!
{
    if(x==1)return 0;
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0)return 0;
    return 1;
}
int main()
{
    ios::sync_with_stdio(false);
    for(int d1=1;d1<=9;d1++)
    {
        if(judge(d1))pos[++cnt]=d1;//1位回文数
        if(judge(d1+10*d1))pos[++cnt]=d1+10*d1;//2位回文数
    }
    for(int d1=1;d1<=9;d1=d1+2)//个位数为偶数不可能是素数,d1=d1+2
    {
        for(int d2=0;d2<=9;d2++)
        {
            s=100*d1+10*d2+d1;
            if(judge(s))pos[++cnt]=s;//3位回文数
            s=1000*d1+100*d2+10*d2+d1;
            if(judge(s))pos[++cnt]=s;//4位回文数
        }
    }
    for(int d1=1;d1<=9;d1=d1+2)
    {
        for(int d2=0;d2<=9;d2++)
        {
            for(int d3=0;d3<=9;d3++)
            {
                s=1e4*d1+1e3*d2+1e2*d3+1e1*d2+d1;
                if(judge(s))pos[++cnt]=s;//5位回文数
                s=1e5*d1+1e4*d2+1e3*d3+1e2*d3+1e1*d2+d1;
                if(judge(s))pos[++cnt]=s;//6位回文数
            }
        }
    }
    for(int d1=1;d1<=9;d1=d1+2)
    {
        for(int d2=0;d2<=9;d2++)
        {
            for(int d3=0;d3<=9;d3++)
            {
                for(int d4=0;d4<=9;d4++)
                {
                    s=1e6*d1+1e5*d2+1e4*d3+1e3*d4+1e2*d3+1e1*d2+d1;
                    if(judge(s))pos[++cnt]=s;//7位回文数
                    s=1e7*d1+1e6*d2+1e5*d3+1e4*d4+1e3*d4+1e2*d3+1e1*d2+d1;
                    if(judge(s))pos[++cnt]=s;//8位回文数
                }
            }
        }
    }
    sort(pos+1,pos+cnt+1);//cnt=781
    cin>>a>>b;
    for(int i=1;i<=cnt;i++)
    {
        if(pos[i]>=a&&pos[i]<=b)printf("%d\n",pos[i]);
        if(pos[i]>b)break;
    }
    return 0;
}