【HDU】 1431 素数回文

来源:互联网 发布:mac如何卸载opera 编辑:程序博客网 时间:2024/06/06 00:34

素数回文


题目链接

  • 素数回文

题目大意

    求出a到b之间的回文素数。


题解

    仍然是打表暴力…
    关于这个打表的界限是一开始开50000000的时候猜的,然后关于打表的话,能在外面打的全放在外面吧…一开始判定回文的循环放在内层就过不了,放在外面打表就过了…


代码

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;int a,b,tab[200000],h,t;int ans[200000];bool vis[10000005];bool che(int x){    int c=x,t=0;    while(c)    {        t*=10;        t+=c%10;        c/=10;    }    return (x==t);}void settab(int high){    h=0;    memset(tab,0,sizeof(tab));    memset(vis,0,sizeof(vis));    for (int i=4;i<=high;i+=2) vis[i]=1;    int p=(int) sqrt(high);    for (int i=3;i<=p;i+=2) if (!vis[i])    {        int j=i*i;        while(j<=high)        {            vis[j]=1;            j+=i;        }    }    for (int i=2;i<=high;i++) if (!vis[i] && che(i)) tab[h++]=i;}int ser(int k){    int l=0,r=h-1,mid;    while (l!=r)    {        mid=(l+r)>>1;        if (k<=tab[mid]) r=mid;        else l=mid+1;    }    return l;}int main(){    settab(9989899);    while(scanf("%d%d",&a,&b)!=EOF)    {        int low=ser(a),high=ser(b);        if (high!=h-1 && tab[high]!=b) high--;        for (int i=low;i<=high;i++) printf("%d\n",tab[i]);        printf("\n");    }    return 0;}
0 0
原创粉丝点击