思路:
1.先考虑将回文数找出来然后判断是否是素数
具体的优化:
除两位数外,回文素数一定不会是不会是偶数位个(虽然我证明不了,但是大家分享的的确都是这么说的)
在开始的时候先判断一下是否是2的倍数(不然运行速度太慢
#include <cstdio>
#include <iostream>
using namespace std;
int a,b,c,cnt;
int s[11];
bool checkhuiwen(int a,int cnt)
{
int flag=1;
for(int i=1;i<=cnt;i++)
{
s[i]=a%10;
a/=10;
}
for(int i=1;i<=cnt/2;i++)
{
if(s[i]!=s[cnt+1-i]) flag=0;
}
return flag;
}
bool isaprime(int a)
{
int flag=1;
for(int i=2;i*i<=a;i++)
{
if(a%i==0) flag=0;
}
return flag;
}
int main()
{
cin>>a>>b;
for(int i=a;i<=b;i++)
{
c=i;
cnt=1;
if(i%2==0) continue;
while(c>=10)
{
cnt++;
c/=10;
}
if(cnt%2==0&&cnt!=2) continue;
if(checkhuiwen(i,cnt)==0) continue;
if(isaprime(i)==0) continue;
cout<<i<<endl;
}
return 0;
}
2.自己构造回文数,然后判断是不是素数
#include <cstdio>
#include <iostream>
using namespace std;
int a,b,c,d,num[11],cnt,ans[100000001];
int s[11];
bool isaprime(int a)
{
int flag=1;
for(int i=2;i*i<=a;i++)
{
if(a%i==0) flag=0;
}
return flag;
}
int main()
{
cin>>a>>b;
if(a<=10)
{
for(int j=a;j<10;j++)
{
if(isaprime(j)!=0) ans[j]=1;
}
}
if(a<=11) ans[11]=1;
int a1=a,a2=a,cnta=1;
while(a1>=10)
{
cnta++;
a1/=10;
}
//cout<<"cnta="<<cnta<<endl;
if(a2>100)
{
for(int i=1;i<=cnta/2;i++) a2/=10;
}
//cout<<"a="<<a<<endl;
for(int i=a2;i<=b;i++)
{
c=i;
cnt=1;
while(c>=10)
{
num[cnt]=c%10;
cnt++;
c/=10;
}
num[cnt]=c%10;
if(cnt>1)
{
d=i;
for(int j=2;j<=cnt;j++)
{
d=d*10+num[j];
}
if(d<a) d=4;
if(d>b) break;
if(isaprime(d)!=0) ans[d]=1;
d=i;
for(int j=1;j<=cnt;j++)
{
d=d*10+num[j];
}
if(d<a) d=4;
if(isaprime(d)!=0) ans[d]=1;
}
}
for(int i=a;i<=b;i++)
{
if(ans[i]==1) cout<<i<<endl;
}
return 0;
}