最后一个tle,把除了11以外长度为偶数的回文数都不是质数也加上了,还是没过

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

Mrfs @ 2023-05-08 20:11:53

大佬们咋改呀,下面是完整代码...

#include<iostream>
#include<math.h>

using namespace std;

bool isHw(int x)
{
    string strx = to_string(x);
    int len = strx.length()-1;
    for(int i=0;i<=len/2;i++)
    {
        if(strx[i] != strx[len-i]) return false;
    }

    // 优化  除了 11 以外 长度为偶数的回文数都不是质数
    if(x != 11 && (len+1)%2 == 0) return false;
    return true;
}

int main()
{
    int x,y;
    cin >> x >> y;

    if(x%2 == 0) x ++;
    for(int i=x;i<=y;i+=2)
    {
        if(isHw(i))
        {
            bool flag = true;
            for(int j = 2;j<int(sqrt(i))+1;j++)
                if(i%j == 0) 
                {
                    flag = false;
                    break;
                }
            if(flag) cout << i << endl;
        }
    }

    return 0;
}

by xiaofeng_and_xiaoyu @ 2023-05-08 20:39:34

可以在适当部分进行跳过

    if(i==1001){
            i=10001;
        }
        if(i==100001){
            i=1000001;
        }
        if(i==2000001){
            i=3000003;
        }
        if(i==4000001){
            i=7000007;
        }
        if(i==8000001){
            i=9000009;
        }

by xiaofeng_and_xiaoyu @ 2023-05-08 20:42:51

@Mrfs


by Mrfs @ 2023-05-09 11:15:18

@xiaofeng_and_xiaoyu 还是超时了,为啥,,我应该没加错位置吧,感觉跳过了许多数据了啊,为啥还超时...

#include<iostream>
#include<math.h>

using namespace std;

bool isHw(int x)
{
    string strx = to_string(x);
    int len = strx.length()-1;
    for(int i=0;i<=len/2;i++)
    {
        if(strx[i] != strx[len-i]) return false;
    }

    // 优化  除了 11 以外 长度为偶数的回文数都不是质数
    if(x != 11 && (len+1)%2 == 0) return false;
    return true;
}

int main()
{
    int x,y;
    cin >> x >> y;

    if(x%2 == 0) x ++;
    for(int i=x;i<=y;i+=2)
    {
        if(i==1001){
            i=10001;
        }
        if(i==100001){
            i=1000001;
        }
        if(i==2000001){
            i=3000003;
        }
        if(i==4000001){
            i=7000007;
        }
        if(i==8000001){
            i=9000009;
        }

        if(isHw(i))
        {
            bool flag = true;
            for(int j = 2;j<int(sqrt(i))+1;j++)
                if(i%j == 0) 
                {
                    flag = false;
                    break;
                }
            if(flag) cout << i << endl;
        }
    }

    return 0;
}

by Mrfs @ 2023-05-09 17:41:49

@Mrfs 已经解决,在输入的x,y时候判断下

int x,y;
cin >> x >> y;
if(y > 9989899) y=9989899;

|