https://www.luogu.org/problem/show?pid=1217#sub
首先,四位的,六位的,八位的回文数一定不是质数,因为它们都是11的倍数。
此题无需打表质数,因为回文数(应该)比质数少。
枚举回文数,举例五位的:
for(int d1=1;d1<=9;d1++)
for(int d2=0;d2<=9;d2++)
for(int d3=0;d3<=9;d3++){
LL x=10001*d1+1010*d2+100*d3;
if(l<=x)
if(x<=r){
if(isprime(x)) printf("%lld\n",x);
}
else return 0;
}
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
LL l,r;
int a[]={0,2,3,5,7,11};
int isprime(LL x)
{
for(LL i=2;i<=sqrt(x);i++)
if(x%i==0) return 0;
return 1;
}
int main()
{
scanf("%lld%lld",&l,&r);
for(int i=1;i<=5;i++)
if(l<=a[i]) printf("%d\n",a[i]);
for(int d1=1;d1<=9;d1++)
for(int d2=0;d2<=9;d2++){
LL x=d1*101+10*d2;
if(l<=x)
if(x<=r){
if(isprime(x)) printf("%lld\n",x);
}
else return 0;
}
for(int d1=1;d1<=9;d1++)
for(int d2=0;d2<=9;d2++)
for(int d3=0;d3<=9;d3++){
LL x=10001*d1+1010*d2+100*d3;
if(l<=x)
if(x<=r){
if(isprime(x)) printf("%lld\n",x);
}
else return 0;
}
for(int d1=1;d1<=9;d1++)
for(int d2=0;d2<=9;d2++)
for(int d3=0;d3<=9;d3++)
for(int d4=0;d4<=9;d4++){
LL x=1000001*d1+100010*d2+10100*d3+1000*d4;
if(l<=x)
if(x<=r){
if(isprime(x)) printf("%lld\n",x);
}
else return 0;
}
return 0;
}