[P1217]回文质数

原题链接

这次的数据还是挺亲切的
最暴力的写法拿了8个点

最后一个点怎么也不过
然后看题解
Duang
忽然想起来这题讲过

因为4/6/8位是没有回文质数的
[4/6/8位的回文数都是11的倍数]
所以只需要对其他位数的回文数打表
判断是否为质数

但是又忘了还有上下界
所以又白交了一次

总之还是过了啦

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1000000007
#define LL long long
using namespace std;

int a,b,d1,d2,d3,d4,bo,i,f[1000005],p,len,d,l,ans[1000005];

bool pri(int x)
{
    int i;

    for(i=2;i*i<=x;i++)
        if(x%i==0) return false;

    return true;
}

int main()
{
    scanf("%d%d",&a,&b);

    bo=b;

    while(bo)
    {
        bo=bo/10;
        p++;
    }

    f[1]=5;
    f[2]=7;
    f[3]=11;
    len=3;

    if(p>=3)
    {
        for(d1=1;d1<=9;d1++)
            for(d2=0;d2<=9;d2++)
            {
                d=d1*100+d2*10+d1;          
                len++;
                f[len]=d;   
            }           
    }

    if(p>=5)
    {
        for(d1=1;d1<=9;d1++)
            for(d2=0;d2<=9;d2++)
                for(d3=0;d3<=9;d3++)
                {
                    d=d1*10000+d2*1000+d3*100+d2*10+d1;
                    len++;
                    f[len]=d;
                }           
    }

    if(p>=7)
    {
        for(d1=1;d1<=9;d1++)
            for(d2=0;d2<=9;d2++)
                for(d3=0;d3<=9;d3++)
                    for(d4=0;d4<=9;d4++)
                    {
                        d=d1*1000000+d2*100000+d3*10000+d4*1000+d3*100+d2*10+d1;
                        len++;
                        f[len]=d;
                    }
    }

    for(i=1;i<=len;i++)
    {
        if(f[i]continue;
        if(f[i]>b) break;

        if(pri(f[i]))
        {
            l++;
            ans[l]=f[i];
        }
    }

    for(i=1;i<=l;i++)
        printf("%d\n",ans[i]);

    return 0;
}

你可能感兴趣的:(刷题)