蒟蒻求助,最后一点TLE1.2s,测试数据输出到最后一个五位数就超时了

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

FliMz @ 2022-11-27 12:19:35

#include<bits/stdc++.h>
using namespace std;
bool jz(int);
bool jh(int);
int main()
{
    int l,r;
    cin>>l>>r;
    for(int i=l;i<=r;i++)
    {
        if(jz(i)==true)
            if(jh(i)==true)
                cout<<i<<endl;
    }
    return 0;
}
bool jz(int x)
{
    int s=0;
    if(x>3)
        for(int i=2;i<=sqrt(x);i=i+1)
            if(x%i==0)
                s=s+1;
    if(x==1)
        s=s+1;
    if(s==0)
        return true;
    else
        return false;   
}
bool jh(int y)
{
    int n1=y,n2=0;
    for(n1=y,n2=0;n1!=0;n1/=10)
        n2=n2*10+n1%10;
    if(n2==y)
        return true;
    else
        return false;
}

有没有一种更加迅速的速度优化方案


by hedabo_2445 @ 2022-11-27 15:40:51

你的代码有点复杂,可能过于暴力,可能会t

#include<iostream>
using namespace std;
bool r(int n){//质数
    if(n==1) return false;
    else{
        int i;
        for(i=2;i*i<=n;i++)
            if(n%i==0) return false;
        return true;
    }
}
bool b(int n){//回文数
    int sum=0;
    int k=n;
    while(n!=0){
        sum=sum*10+n%10;
        n/=10;
        //倒着加来判断回文
    }
    if(sum==k) return true;
    else return false;
}
int main() {
    int n,sum=0,m;
    cin>>n>>m;
    for(int i=n;i<=m;i++){
        if(i==9989900) break;//注意特判,否则会挂
        if(b(i)&&r(i))cout<<i<<endl;
    }
    return 0;
}

by hedabo_2445 @ 2022-11-27 15:41:27

@FliMz


by DZren @ 2022-12-09 06:03:22

@Hedabo_2509 为什么你的代码能过我的这个看起来没什么区别但是过不了呢 而且 换成你写的回文数判断也不行

#include <iostream>
#define fast()                   \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0)
using namespace std;
int a, b;

bool isPrime(int n)
{
    if (n < 2)
        return false;
    else
    {
        int i;
        for (i = 2; i * i <= n; i++)
        {
            if (n % i == 0)
            {
                return false;
            }
        }
        return true;
    }
}

string s;
int sLen;
bool isLoop(int n)
{
    s = to_string(n);
    sLen = s.length();
    for (int i = 0; i < sLen / 2; i++)
    {
        if (s[i] != s[sLen - 1 - i])
        {
            return false;
        }
    }
    return true;
}
// bool isLoop(int n)
// { // 回文数
//     int sum = 0;
//     int k = n;
//     while (n != 0)
//     {
//         sum = sum * 10 + n % 10;
//         n /= 10;
//         // 倒着加来判断回文
//     }
//     if (sum == k)
//         return true;
//     else
//         return false;
// }

void miniJianZhi(int &i)
{
    if (i % 2 == 1)
    {
        i += 2;
    }
    else
    {
        i++;
    }
}

int main()
{
    // fast();
    // cin >> a >> b;
    scanf("%d%d", &a, &b);
    int cnt = 0;
    for (int i = a; i <= b; )
    {
        if (i == 9989900)
            break;
        if (isPrime(i) && isLoop(i))
        {
            // cout << i << '\n';
            printf("%d\n", i);
        }
        miniJianZhi(i);
    }
    return 0;
}

by Lucas2024 @ 2023-01-25 16:48:20

试试这样:

#include<iostream>
#include<cmath>
using namespace std;
int m,n,pal[100000005],pos=4;
bool isprime(int x)
{
    int i;
    for(i=2;i<=sqrt(x);i++)
    {
        if(x%i==0)
        {
            return false;
            break;
        }       
    }
    return true;
}
int main()
{
    int a,b,c,d,e,i;
    cin>>m>>n;
    //构造回文数 
    pal[1]=5;pal[2]=7;pal[3]=11;
    for(a=1;a<=9;a+=2)/*只有奇数是素数*/
    {
        for(b=0;b<=9;b++)
        {
            pal[pos++]=101*a+10*b;
        }       
    }
    for(a=1;a<=9;a+=2)
    {
        for(b=0;b<=9;b++)
        {
            for(c=0;c<=9;c++)
            {
                pal[pos++]=10001*a+1010*b+100*c;
            }
        }
    }
    for(a=1;a<=9;a+=2)
    {
        for(b=0;b<=9;b++)
        {
            for(c=0;c<=9;c++)
            {
                for(d=0;d<=9;d++)
                {
                    pal[pos++]=1000001*a+100010*b+10100*c+1000*d;
                }
            }
        }
    }
    for(a=1;a<=9;a+=2)
    {
        for(b=0;b<=9;b++)
        {
            for(c=0;c<=9;c++)
            {
                for(d=0;d<=9;d++)
                {
                    for(e=0;e<=9;e++)
                    {
                        pal[pos++]=100000001*a+10000010*b+1000100*c+101000*d+10000*e;
                    }
                }               
            }
        }
    }   
    for(i=1;pal[i]<=n;i++)
    {
        if(pal[i]>=m&&isprime(pal[i]))
        {
            cout<<pal[i]<<endl;
        }
    }
    return 0;
}

我用回文判断就不行,试试构造回文数以后判素


|