注解
1、如果直接暴力求解,不是超时就是超内存。
2、通过预实验得知,在题目范围内的最大的素数回文数是9989899,这样就可以省去很多的查找时间了。
3、先用筛法求素数,把求得的素数用prime数组存储。
4、找回文不要用字符串,太慢!而是要用int不断除以10取余的方法将原来的数字倒序,然后看二者是否相等。
代码
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 9989899+10;
bool isPrime[maxn];
vector<int> v;
int par(int n) {
int m = 0;
while(n) {
int t = n%10;
m = m*10 + t;
n /= 10;
}
return m;
}
void sieve() {
vector<int> prime;
memset(isPrime, true, sizeof(isPrime));
for(int i=2; i<maxn; i++) {
if(isPrime[i]) {
prime.push_back(i);
for(int j=i+i; j<maxn; j+=i) {
isPrime[j] = false;
}
}
}
int size = prime.size();
for(int i=0; i<size; i++) {
int num = prime.at(i);
if(par(num)==num) {
v.push_back(num);
}
}
}
int main() {
sieve();
int a, b;
while(cin>>a>>b) {
int size = v.size();
for(int i=0; i<size; i++) {
if(v.at(i)>=a && v.at(i)<=b) {
cout<<v.at(i)<<endl;
}
}
cout<<endl;
}
return 0;
}