刚开始这样写会超时: 因为范围最大1e8,所以要进行优化:
试除法
#include<bits/stdc++.h>
using namespace std;
int isprime(int x)
{
if(x<2)return 0;
for(int i=2;i*i<=x;i++)
{
if(x%i==0)return 0; //不是素数
}
return 1;
}
int check(int x)
{
string s=to_string(x);
for(int i=0,j=s.size()-1;i<s.size();i++)
{
if(s[i]!=s[j])return false;
}
return true;
}
int main()
{
int l,r;cin>>l>>r;
for(int i=l;l<=r;i++)
{
if(isprime(i)&&check(i))
{
cout<<i<<endl;
}
}
return 0;
}
埃氏筛法
#include<bits/stdc++.h>
using namespace std;
const int N=1e8+10;
bool book[N];
int l,r;
//埃氏筛法
bool isprime(int x )
{
memset(book,true,sizeof book);
book[1]=false; //1不是素数
for(int i=2;i<=sqrt(x);i++)
{
if(book[i]) //没被筛掉,一定是素数
{
for(int j=2;j<=x/i;j++)
{
book[i*j]=false; //素数的倍数一定是合数 筛掉
}
}
}
}
//检查是否为回文串
bool check(int i)
{
string s=to_string(i);
for(int i=0,j=s.size()-1;i<s.size();i++,j--)
{
if(i<j&&s[i]!=s[j])return false;
}
return true;
}
void sovel()
{
cin>>l>>r;
//剪枝 不剪通不过
if (r >= 10000000) r = 9999999;
isprime(r);
if (l> r) return; //越界
for(int i=l;i<=r;i++)
{
if(book[i]&&check(i)) //如果是素数且是回文数就输出
{
cout<<i<<endl;
}
}
}
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
sovel();
return 0;
}