回文素数

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;
}

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值