66分,绿蓝灯!!!

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

Oscar111111 @ 2024-07-02 13:27:39

#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
    if(n==1||n==0) return false;
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0) return false;
    return true;
}
bool isplindromes(int n){
    int m=0,x=n;
    while(x!=0){
        m=m*10+x%10;
        x=x/10;
    }
    if(n==m) return true;
    else return false;
}
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++)
        if(isprime(i)&&isplindromes(i)) cout<<i<<endl;
    return 0;
}

AC AC AC AC AC AC TLE TLE TLE


by donghanwen1225 @ 2024-07-02 13:56:30

@Oscar111111 代码超时是由于复杂度过大而引起的,需要优化算法才能解决。

首先,判定一个数是不是质数的复杂度要高于判定是不是回文数。所以先判定是否为回文数,如果不是就直接跳过,可以节省计算次数;

同时,利用能整除 11 的数的性质,可以发现一个有偶数位的数不可能是质数。因此在 10^710^8 之间的数一定不符合要求,如果 b>=10^7 就可以直接把 b 看做 10^7-1


by Oscar111111 @ 2024-07-02 14:00:06

#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
    if(n==1||n==0) return false;
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0) return false;
    return true;
}
bool isplindromes(int n){
    int m=0,x=n;
    while(x!=0){
        m=m*10+x%10;
        x=x/10;
    }
    if(n==m) return true;
    else return false;
}
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++){
        if(isplindromes(i))
            if(isprime(i)) cout<<i<<endl;
    }
    return 0;
}

88分


by syy999 @ 2024-07-05 09:18:59

我也是

#include<bits/stdc++.h>
using namespace std;
#define int long long
bool p(int a){
    if(a==1) return 0;
    for(int i=2;i<=sqrt(a);i++) if(a%i==0) return 0;
    return 1;
}
bool h(int a){
    int f=0,t=a;
    while(t!=0){
        f=f*10+t%10;
        t=t/10;
    }
    if(f==a) return 1;
    else return 0;
}
signed main(){
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++){
        if(p(i)&&h(i)) cout<<i<<endl;
    }
    return 0;
} 

by Ascnbeta @ 2024-07-05 14:59:17

@Oscar111111 你还没有把偶数和偶数数位的回文数continue掉啊


by Ascnbeta @ 2024-07-05 15:05:15

@syy999 偶数数位的回文数和偶数都一定不是质数(可自行搜索能被11整除的数的特征),因此它们需要被continue掉(即两位数、四位数、六位数、八位数一定不满足题意)

另外 p(i)&&h(i) 的方式会导致先判断该数是不是质数,再判断该数是不是回文数(不理解可以搜&&的判断过程),由于判断质数的时间复杂度更高,所以会浪费时间。因此应当改成 h(i)&&p(i)


by Oscar111111 @ 2024-07-18 14:14:44

 int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++){
        if(i%2==0&&i!=2) continue
        if(isplindromes(i))
            if(isprime(i)) cout<<i<<endl;
    }
    return 0;

by Oscar111111 @ 2024-07-18 14:20:55

AC了!!!!!!!!!!!!


by syy999 @ 2024-07-24 11:12:11

AC了!!!!!!!!!!!!


|