给定两个边界,求输出所有这个边界以内,既是素数又是回文的数字;
一开始用的素数筛,爆内存了。
改为生成回文后检测是否为素数,在如何递归生成回文上卡了很久。一直纠结于边界情况的处理。
/*
ID: modengd1
PROG: pprime
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <math.h>
using namespace std;
typedef long long ll;
long long A,B;
bool IsPrime(int x)
{
if(x==2)
return true;
if(x%2==0)
return false;
for(int i=3;i*i<=x;i++)
{
if(x%i==0)
return false;
}
return true;
}
void slove(int deep,int limit,int fro,int tair)//deep为当前回文串的长度,limit为要求的回文串的长度,fro为生成的回文串的前半部分,tair为后半部分,当前后不一样长时将中间的数字划分到前半部分
{
int ans;
if(deep==limit)
{
ans=fro*pow(10,(deep/2))+tair;
if(ans<A||ans>B)//检查是否超出边界
return;
if(IsPrime(ans))
{
cout<<ans<<endl;
}
return;
}
if((limit-deep)==1)//如果需要求的回文串长度为奇数,且已经生成了除最中间的数字以外的前后两部分之后
{
for(int i=fro==0?1:0;i<10;i++)
{
slove(deep+1,limit,fro*10+i,tair);
}
}
else//给fro的末尾加一个数字,给tair的前面加相同的数字
{
for(int i=fro==0?1:0;i<10;i++)
{
slove(deep+2,limit,fro*10+i,pow(10,(deep/2))*i+tair);
}
}
}
int main()
{
freopen("pprime.in","r",stdin);
freopen("pprime.out","w",stdout);
cin>>A>>B;
int st,en;
//得出边界的位数
for( st=0;A>pow(10,st);st++);
for( en=0;B>pow(10,en);en++);
for(int i=st;i<=en;i++)
{
slove(0,i,0,0);
}
return 0;
}