TLE!!救命

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

gzx_0928 @ 2024-07-05 14:36:25

#include<bits/stdc++.h>
using namespace std;
int a,b;
int jjb(int x)//判断质数 
{
    for(int i=2;i*i<=x;i++)
    {
        //能不能除尽 
        if(x%i==0)
        {
            return 0;
        }
    }
    return 1;
}
bool jjb2(int x)//判断回文数 
{
    int y=x,num=0;
    while(y!=0)
    {
        num=num*10+y%10;
        y=y/10;
    }
    //左右两边是否相等 
    if(num==x)
    {
        return 1;
    } 
    else
    {
        return 0;
    } 
}
int main()
{
    cin>>a>>b;
    for(int k=a;k<=b;k++)
    {
        if(jjb(k))
        {
            if(jjb2(k))
            {
                cout<<k<<endl;
            }
        }
    }
    return 0;
} 

by Targanzqq @ 2024-07-05 14:49:33

你可以先考虑把质数用欧拉筛给筛出来,要不然1e8再乘上一个位数就肯定会T掉


by Ascnbeta @ 2024-07-05 14:49:34

@gzx_0928 不必每一个数都进行判断回文数和质数,首先遇到 2 的倍数可以直接 continue ;另外偶数位的回文数一定不是质数,所以可以跳过不去判断; 最后判断回文数是要比判断质数快的,所以应当把判断回文数的 if 写在前面


by Targanzqq @ 2024-07-05 14:50:31

???你这复杂度可不是超了一点啊,对1e8跑 n \sqrt n 怎么可能不超时


by Ascnbeta @ 2024-07-05 14:53:08

@gzx_0928 所以把

for(int k=a;k<=b;k++)
    {
        if(jjb(k))
        {
        if(jjb2(k))
        {
            cout<<k<<endl;
            }
        }
    }

改为

for(int k=a;k<=b;k++)
    {   
        if (k % 2 == 0) continue; 
        if(k==1000||k==100000||k==10000000)
        {
            k*=10;
        }
        if(jjb2(k))
        {
            if(jjb(k))
            {
                cout<<k<<endl;
            }
        }
    }

by Ascnbeta @ 2024-07-05 14:55:57

至于为什么偶数位的回文数一定不是质数,是因为它们符合被11整除的数的共同特征(具体去网上搜),因此偶数位的回文数一定不是质数


by gzx_0928 @ 2024-07-05 15:04:29

@AlwaysSunshine 谢谢!


by gzx_0928 @ 2024-07-05 15:06:43

@AlwaysSunshine 以A,外加关注


|