为什么?测试对了,但还是错了!!!

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

ValueError @ 2024-09-23 13:09:38

#include<bits/stdc++.h>
#include<unistd.h>
#include<cstring>
using namespace std;
typedef long long lll;
lll a,b;
bool pd(lll num){//质数返回真,素数返回假 
   if(num==1||num==4) 
      return 0;
   if(num==2||num==3)
      return 1;
   if(num %6!= 1&&num %6!=5)
      return 0 ;
   int tmp =sqrt(num);
   for(int i=5;i<=tmp;i+=6) {       
      if(num%i==0||num%(i+2)==0){
        return 0 ;
      }  
    }
}  
bool hw(int n){//回文返回真,否则返回假 
    int n1=n,n2=0;
    while(n>0) {
        n2=n2*10+n%10;
        n/=10;
    }
    return n1==n2;
}
int main(){
    cin>>a>>b;
    for(int i=a;i<=b;i++){
        if(pd(i) && hw(i)){
            cout<<i<<endl;
        }
    }
    return 0;
}

by luoyebushiye @ 2024-09-23 13:15:38

@PowerStudio

你的代码好像最后死循环了(但是你的答案是对的)

也建议你数据开大点(个人观点)


by ValueError @ 2024-09-25 16:47:40

@luoyebushiye 哪里错了?求大神指点(悬赏三个赞)


by ValueError @ 2024-09-25 16:48:18

@luoyebushiye 我用的是long long(前面typedef了)


by luoyebushiye @ 2024-09-25 20:10:19

@PowerStudio

#include<bits/stdc++.h>
#include<unistd.h>
#include<cstring>
using namespace std;
typedef long long lll;
lll a,b;
int zs(long long j){
    for(long long s=2;s<=sqrt(j);s++){
        if(j%s==0)
            return 0;
    }
    return 1; 
} 
bool hw(int n){//回文返回真,否则返回假 
    int n1=n,n2=0;
    while(n>0) {
        n2=n2*10+n%10;
        n/=10;

    }
    return n1==n2;
}
int main(){
    cin>>a>>b;
    for(int i=a;i<=b;i++){
        if(zs(i) && hw(i)){
            cout<<i<<endl;  
        }
    }
    return 0;
}

这样60,你的质数判断好像有问题,帮改了一下,剩下的应该是回文判断时间太长了,所以TLE了,给你一个提示,数据不会超过10000000


by ValueError @ 2024-09-26 12:21:32

@luoyebushiye

谢谢谢谢,多谢大神指点!


by ValueError @ 2024-09-26 12:25:30

自己昨天改了一下

// #include<bits/stdc++.h>
// #include<unistd.h>
// #include<cstring>
// using namespace std;
// typedef long long lll;
// lll a,b;
// bool pd(lll num){//质数返回真,素数返回假 
//     if(num<=1){
//         return 0;
//     }

//   for(int i=2;i*i<=num;i++) {       
//       if(num%i==0){
//      return 0 ;
//    }  
//  }
//  return 1;
// }  
// bool hw(lll x) {
//     if (x < 0) return false; // 负数不是回文
//     string str = to_string(x);
//     int left = 0, right = str.length() - 1;

//     while (left < right) {
//         if (str[left] != str[right]) return false;
//         left++;
//         right--;
//     }
//     return true;

// }
// int main(){
//     cin>>a>>b;
//     if(a==2){
//      cout<<"2"<<endl;
//  }
//     for(int i=a;i<=b;i++){
//      if(pd(i)==true && hw(i)==true){
//          printf("%d",i);
//      }
//  }
//     return 0;
// }

by luoyebushiye @ 2024-09-26 13:11:34

@PowerStudio

#include<bits/stdc++.h> 
using namespace std;
int mc(long long j){
    for(long long s=2;s<=sqrt(j);s++){
        if(j%s==0)
            return 0;
    }
    return 1; 
}
int main(){
long long n,m;
cin>>n>>m;
for(long long i=n;i<=m;i++){
    if(i<=100){
        if(i==1||i==3||i==5||i==7||i==11)
            cout<<i<<endl;
    }
    else if(i>100&&i<1000){
        if(i%10==i/100){
            if(mc(i)==1)
                cout<<i<<endl;
        }
    }
    else if(i>=1000&&i<10000){
        if(i%10==i/1000&&i%100/10==i%1000/100){
            if(mc(i)==1)
                cout<<i<<endl;
        }
    }
    else if(i>=10000&&i<100000){
        if(i%10==i/10000&&i%100/10==i%10000/1000){
            if(mc(i)==1)
                cout<<i<<endl;
        }
    }
    else if(i>=100000&&i<1000000){
        if(i%10==i/100000&&i/10000%10==i%100/10&&i%10000/1000==i%1000/100){
            if(mc(i)==1)
                cout<<i<<endl;
        }
    }
    else if(i>=1000000&&i<10000000){
        if(i%10==i/1000000&&i/100000%10==i%100/10&&i%1000/100==i/10000%10){
            if(mc(i)==1)
                cout<<i<<endl;
        }
    }
}
return 0;
}

|