77分求调,最后两个一个WA一个MLE

P1217 [USACO1.5] 回文质数 Prime Palindromes

z1443888087 @ 2024-09-10 22:26:58

#include<iostream>
using namespace std;
bool com(int x){
    int temp=x,ans=0;
    while(temp>0){
        ans=ans*10+temp%10;
        temp/=10;
    }
    if(ans==x)return true;
    else return false;
}
int main(){
    int a,b;
    cin>>a>>b;
    int prime[b+1];
    int m_prime[b+1];
    int count=0;
    for(int i=2;i<b;i++)prime[i]=1;
    for(int i=2;i<b;i++){
        if(prime[i]==1){
            m_prime[count]=i;
            count++;
            for(int j=i*2;j<=b;j+=i){
                prime[j]=0;
            }
        }
    }
    for(int i=0;i<count;i++){
        if(com(m_prime[i])&&m_prime[i]>=a){
            cout<<m_prime[i]<<endl;
        }
    }
}

by CSP400pts @ 2024-09-10 22:28:27

@z1443888087 b 的大小超过了亿,你能不 TLE 吗?


by CSP400pts @ 2024-09-10 22:29:45

@z1443888087 啊呸,MLE


by CSP400pts @ 2024-09-10 22:32:15

@z1443888087 首先,告诉你一个冷知识,大于 9999999 的数在本题里都不是素数,建议暴力枚举,写出两个函数,一个判断素数,一个判断回文数。用回文数判断筛掉一部分,优化时间,如果是回文数,在判断是否是素数。

AC code:

#include<bits/stdc++.h>
using namespace std;
int l,r;
bool huiwen(int i){
    int sum=0,x=i;
    while(x!=0){
        sum=sum*10+x%10;
        x/=10;
    }
    if(sum==i) return 1;
    else return 0;
}
bool prime(int x){
    if(x==1) return 0;
    for(int i=2; i*i<=x; i++)
        if(x%i==0) return 0;
    return 1;
}
int main(){
    cin>>l>>r;
    for(int i=l; i<=r; i++){
        if(i>9999999) break;
        if(!huiwen(i)) continue;
        else{
            if(prime(i)) cout<<i<<endl;
            else continue;
        }
    }
    return 0;

求关注qwq


by dacongming123 @ 2024-09-20 13:37:48

@CSP400pts 听我说谢谢你

因为有你

我不再TLE

谢谢你

感谢有你

我已经AC


|