1356. 回文质数 知识点:素数筛法

45 阅读1分钟

1356. 回文质数 - AcWing题库

刚开始这样写会超时: 因为范围最大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;
}

image.png

埃氏筛法

#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;
}

image.png