算法竞赛模板 回文素数

求a~b之间所有回文素数的方法

先创造出a~b之间的所有回文数,再依次判断是否为素数。

ps:若先找素数再判断回文数会超时!

#include<bits/stdc++.h>
using namespace std;
int lena,lenb,a,b,num[10];
//获取数的位数
int getlen(int n)
{
    int len=0;
    while(n)
    {
        n/=10;
        len++;
    }
    return len;
}
//判断素数
int jud(int n)
{
    if(n<a||n>b)return 0;
    for(int i=2;i*i<=n;i++)
        if(n%i==0)return 0;
    return 1;
}
//幂函数
int p(int a,int n)
{
    int i,sum=1;
    for(i=1;i<=n;i++)sum*=a;
    return sum;
}
//获取字符串的值
int getval(int len)
{
    int sum=0,i;
    for(i=1;i<=len;i++)
        sum+=num[i]*p(10,i-1);
    return sum;
}
//位数为len的回文数构造
void creat(int len,int pos)
{
    int i,t,hlen=(1+len)/2;
    for(i=0;i<10;i++)
    {
        if(!i&&pos==1)continue;
        num[pos]=num[len+1-pos]=i;
        if(pos<hlen)
        {
            pos++;
            creat(len,pos);
            pos--;
        }
        else
        {
            t=getval(len);
            if(jud(t))printf("%d\n",t);
        }
    }
}
void ok(int lena)
{
    int i;
    memset(num,0,sizeof(num));
    for(i=lena;i<=lenb;i++)
        creat(i,1);
}
int main()
{
    scanf("%d%d",&a,&b);
    lena=getlen(a);
    lenb=getlen(b);
    ok(lena);
    return 0;
}

 

posted @ 2018-08-19 14:07  真想不出名字了  阅读(289)  评论(0编辑  收藏  举报