int prime[60000005];
bool tag[100000005];
memset(tag,0,sizeof(tag));
int cnt=0;
tag[0]=tag[1]=1;
for (int i=2;i<b;i++)
{
if (!tag[i])
prime[cnt++]=i;
for (int j=0;j<cnt and prime[j]*i<b;j++)
{
tag[i*prime[j]]=1;
if (i%prime[j]==0)
break;
}
}
prime保存所有素数,用来枚举最小质因子
tag判断数字是否为质数,0为质数。
注意本题因为内存限制,tag不能用int,否则会爆内存。使用bool可以节约内存
AC代码
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <iomanip>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9'){if (ch=='-')f=-1;ch=getchar();}
while (ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
bool judge2(int x)
{
int s=x,y=0;
while (s>0)
{
y=y*10+s%10;
s/=10;
}
if (y==x) return true;
else return false;
}
int main()
{
int a,b;
a=read();b=read();
int prime[60000005];
bool tag[100000005];
memset(tag,0,sizeof(tag));
int cnt=0;
tag[0]=tag[1]=1;
for (int i=2;i<b;i++)
{
if (!tag[i])
prime[cnt++]=i;
for (int j=0;j<cnt and prime[j]*i<b;j++)
{
tag[i*prime[j]]=1;
if (i%prime[j]==0)
break;
}
}
for (int i=a;i<=b;i++)
{
if (!tag[i] && judge2(i))
cout<<i<<endl;
}
return 0;
}