回文素数

Description

因为151即是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 号是回文质数。 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)间的所有回文质数;

Input

第 1 行: 二个整数 a 和 b

Output

输出一个回文质数的列表,一行一个。

Sample Input

5 500

Sample Output

5
7
11
101
131
151
181
191
313
353
373
383

思路:数据量是1e8 正常方法做肯定不行  可以先打一个回文数的表(回文的数比素数少)

(只打3 5 7位的就行 因为偶数位的不可能是素数)

3位数可以通过2位数翻转前1位得来    5位数可以通过3位数翻转前两位而来  7位数可以通过4位数翻转前3位而来

打完表后直接判断是不是素数就可以了

AC代码:

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <deque>
using namespace std;
typedef long long ll;
ll ans[10100]={0};
ll s[10000]={2,3,5,7,11,0};
ll yang(ll p)
{
    ll i,j,m=0;
    for(i=0;i<p;i++)
    {
        ll k=sqrt(s[i]);
        for(j=2;j<=k;j++)
        {
            if(s[i]%j==0)
                break;
        }
        if(j==k+1)
            ans[m++]=s[i];
    }
    return m;
}
int main()
{
    ll n,i,j,a,b,x,y,z,w;
    cin>>a>>b;
    ll p=5;
    for(i=10;i<99;i++)
    {
        s[p++]=10*i+i/10;
    }
    for(i=100;i<=999;i++)
    {
        x=i/10%10;
        y=i/100;
        s[p++]=100*i+x*10+y;
    }
    for(i=1000;i<=9999;i++)
    {
        x=i/10%10;
        y=i/100%10;
        z=i/1000;
        s[p++]=i*1000+x*100+y*10+z;
    }
    ll m=yang(p);
//    for(i=0;i<m;i++)
//        cout<<s[i]<<" ";
    for(i=0;i<m;i++)
    {
        if(ans[i]>=a&&ans[i]<=b)
            cout<<ans[i]<<endl;
    }
    return 0;
}

 

posted @ 2018-09-14 20:36  ~~zcy  阅读(481)  评论(0编辑  收藏  举报