dfs生成所有的奇数长度回环数,然后判断其是否为质数即可。
偶数长度的回环数都是11的倍数,只有11是质数,直接添加即可。
因为abba=a00a+bb0=a*1001+b0*1100=(a*99+b0)*11.其他可类推
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream fin("pprime.in");
ofstream fout("pprime.out");
#ifdef _DEBUG
#define out cout
#define in cin
#else
#define out fout
#define in fin
#endif
bool is_prime(int num);
vector<int>result;
int a,b;
void dfs(int num,int len)
{
if(len>8)
return;
if(is_prime(num))
result.push_back(num);
int factor = 1;
for(int i=0;i<len;++i)
factor*=10;
for(int i=0;i<10;++i){
//左右各加一个i
int temp = factor*i;
temp+=num;
temp*=10;
temp+=i;
dfs(temp,len+2);
}
}
void solve()
{
in>>a>>b;
for(int i=0;i<10;++i)
dfs(i,1);
//11直接加了
result.push_back(11);
sort(result.begin(),result.end());
for(int i=0;i<result.size();++i)
if(result[i]>=a&&result[i]<=b)
out<<result[i]<<endl;
}
// num>=2
bool is_prime(int num)
{
if(num==2) return true;
int root = (int) sqrt(num);
for(int i=2;i<=root;++i)
if(num%i==0)
return false;
return true;
}
int main(int argc,char *argv[])
{
solve();
return 0;
}