求大佬帮助!两个WA,三个TLE!: (

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

LiamZou @ 2023-09-28 13:20:24

#include <bits/stdc++.h>
using namespace std;
int reverse(int x)
{
    string s = to_string(x), s1;
    for (int i = 0, j = s.size() - 1; i < s.size() && j >= 0; i++, j--)
    {
        s1[j] = s[i];
    }
    x = stoi(s1);
    return x;
}
bool is_prime(int y)
{
    if (y == 2)
    {
        return true;
    }
    for (int i = 2; i * i < y; i++)
    {
        if (y % i == 0)
        {
            return false;
        }
    }
    return true;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a, b;
    cin >> a >> b;
    for (int i = a; i <= b; i++)
    {
        if (is_prime(i) && i == reverse(i))
        {
            cout << i << endl;
        }
    }
    return 0;
}

by chenwenji @ 2023-10-05 19:03:12

这题吗……

我用的不是制造回文数,是从a找到b。那怎么会不超时呢?

1、我从奇数开始找,每次+2;

2、我发现,没有偶数位的回文质数!省了一大把的时间啊!

虽说还是很慢,不过很好写就是了!哈哈。

下面列核心的三个判断:

bool ok(int k)   //回文数
{     
    int a[10],i=0;     
    while (k>0){a[i]=k%10;k/=10;i++;}
    for(int j=0;j<i;j++)if(a[j]!=a[i-j-1])return false;   
    return true;     
}
bool ws(int k)  //位数
{
    if(k>=10 && k<100 && k!=11 || k>=1000 && k<10000)return false;
    if(k>=100000 && k<1000000 || k>=10000000 && k<100000000)return false;
    return true;
}
bool ss(int k)   //素数
{     
    for(int i=3;i*i<=k;i+=2)if(k%i==0)return false;     
    return true;
}

更优的方法是制造回文数,这个我就不说了。


|