前面全对,最后一个TLE咋办

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

caizehao @ 2023-04-28 17:32:14

代码如下:

#include <bits/stdc++.h>
using namespace std;

bool is_hw(int a){
    int b=a;
    int c=0;
    while(b!=0){
        c=c*10+b%10;
        b=b/10;
    }
    if(c==a){
        return true;
    }
    return false;
}
int is_ss(int a){
    if(a%2==0 && a!=2){
        return false;
    }
    int x=sqrt(a);
    for(int i=3;i<=x;i+=2){
        if(a%i==0){
            return false;
        }
    }
    return true;
}
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    for(int i=a;i<=b;i++){
        if(is_hw(i) && is_ss(i)){
            printf("%d\n",i);
        }
    }
    return 0;
}

by Patronus @ 2023-04-28 17:46:00

先用线性筛把区间内的质数筛出来在判断是否回文


by caizehao @ 2023-04-29 18:34:10

看了题解后发现在循环中加上:

if(i==9989900){
    break;
}

就可以了

AC代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;

bool is_hw(int a){
    int b=a;
    int c=0;
    while(b!=0){
        c=c*10+b%10;
        b=b/10;
    }
    if(c==a){
        return true;
    }
    return false;
}
int is_ss(int a){
    if(a%2==0 && a!=2){
        return false;
    }
    int x=sqrt(a);
    for(int i=3;i<=x;i+=2){
        if(a%i==0){
            return false;
        }
    }
    return true;
}
signed main(){
    int a,b;
    scanf("%d%d",&a,&b);
    for(int i=a;i<=b;i++){
        if(i==9989900){
            break;
        }
        if(is_hw(i) && is_ss(i)){
            printf("%d\n",i);
        }
    }
    return 0;
}

|