题目链接:http://train.usaco.org/usacoprob2?a=gR1up10aYLj&S=pprime
题意:求在n,m范围内的回文素数。m<=1e9
思路:
先筛出素数,再一个个判断它们是不是回文数。
但是,1e9明显开不到,太大了。
竟然有这么一个性质。。不存在偶数位的回文素数。
所以!!直接开1e7的就好辣
代码
/*
ID: 49743541
LANG: C++
TASK: pprime
*/
#include <stdio.h>
#include <math.h>
#include <fstream>
using namespace std;
bool prime[10000000];
int number[10000];
int bottom,top;
void prim(){
int m = sqrt(10000000);
for(int i = 1;i<10000000;i++)
if(i%2)
prime[i] = true;
else
prime[i] = false;
int i,j;
for(i=3;i<m;i+=2){
if(prime[i])
for(j=i+i;j<=10000000;j+=i)
prime[j]=false;
}
}
int shu[11];
bool judge(int num){
int pb = 1;
int pe = 0;
while(num){
pe++;
shu[pe] = num%10;
num/=10;
}
int t = pe/2;
while(t--){
if(shu[pe]!=shu[pb])
return false;
pe--;
pb++;
}
return true;
}
int N;
void Palindrome(){
for(int i = 1;i<10000000;i++){
if(prime[i])
if(judge(i))
number[N++] = i;
}
}
int main(){
freopen("pprime.in", "r", stdin);
freopen("pprime.out", "w", stdout);
prim();
Palindrome();
int count = 0;
scanf("%d%d",&bottom,&top);
for(int i = 0;i<=N;i++)
if(number[i]>=bottom&&number[i]<=top)
printf("%d\n",number[i]);
else if(number[i]>top)
break;
return 0;
}