回文素数
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;
}