大佬求助!!!最后一个测试点TLE了

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

luolie0804 @ 2023-05-18 19:00:15

#include<bits/stdc++.h>
using namespace std;
int hw(int n)
{
    int s=0,g;
    while(n>0)
    {
        g=n%10;s=s*10+g;n=n/10;
    }
    return s;
}
int isprime(int n)
{
    if(n<2) return false;
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            return false;
        }
    }
    return true;
}
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
        if(hw(i)==i&&isprime(i))
        {
            cout<<i<<endl;
        }
    }
    return 0;
}

by luolie0804 @ 2023-05-18 19:47:56

我刚学C++一年


by _Adolf_Hitler_ @ 2023-05-18 19:58:56

6


by xiaoyang111 @ 2023-05-18 21:05:19

……什么时候唠嗑了?


by xiaoyang111 @ 2023-05-18 21:13:29

实在不行看题解吧

#include <bits/stdc++.h>//万能头
using namespace std;
bool func1(int a){//回文判断 
    int a1=a;
    int a2=0;
    while (a){
        a2=a2*10+(a%10);
        a/=10;
    }
    return a1==a2;
}
bool func2(int a){//素数判断 
    for (int i=2;i*i<=a/*个人猜测sqrt时间复杂度高一些*/;++i){
        if (a%i==0){
            return false;
        }
    }
    return true; 
}
int main(){
    vector<int> v;
    int a,b;
    cin >> a >> b;
    if (a%2==0){
        ++a;
    }
    for (int i=a;i<=b;i+=2){
        if ((i>929 && i<10301) || 
            (i>98689 && i<1003001) || 
            (i>1998991 && i<3001003) || 
            (i>3998993 && i<7014107) || 
            (i>7996997 && i<9002009)){//根据真实答案推测出这些大范围没有回文质数 
            continue;
        }
        if (i==9989899){//最后一个回文质数,质数判断可能会TLE 
            cout<<i<<endl;
        }else if (func1(i) && func2(i)){//如果都符合条件 
            cout<<i<<endl;
        }
    }
    return 0;
}

我的AC代码,看看注释吧


by xiaoyang111 @ 2023-05-18 21:16:38

不得不说,这道题处理TLE是真的烦 记录


by xiaoyang111 @ 2023-05-18 21:17:22

@luolie0804 刚才那个代码不开O2 C++11可以过


by xiaoyang111 @ 2023-05-18 21:20:13

@luolie0804 五年级,刚开始注册洛谷时学的c++,Python感觉太简单了上了一个月就没上了

从我主页看嘛


by xiaoyang111 @ 2023-05-19 17:10:56

代码需开O2过


by chenzher @ 2023-05-30 20:56:50

@luolie0804 主函数里的可以改成这样:

int a,b;
cin>>a>>b;
if(a%2==0) a++;
for(int i=a;i<=b;i+=2)
{
    if(hw(i)==i&&isprime(i))
    {
        cout<<i<<endl;
    }
}
return 0;

by luolie0804 @ 2023-05-30 21:02:39

@xuzichen2023 谢谢大佬!!!


上一页 | 下一页