好像超时了,求调

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

Eletronic_Monkey @ 2024-10-22 23:27:16

#include<stdio.h>
void search (int a);
int b,c;
int main()
{
    int number,d1,d2,d3,d4,d5;
    scanf("%d %d",&b,&c);
        for (d1 = 1; d1 <= 9; d1+=2) {
        number=d1;    
           search(number);
    }
        for (d1 = 1; d1 <= 9; d1+=2) {    
           number = 10*d1 +d1 ;
           search(number);
    }
    for (d1 = 1; d1 <= 9; d1+=2) {    
     for (d2 = 0; d2 <= 9; d2++) {
           number = 100*d1 + 10*d2 +d1 ;
           search(number);
        }
    }
        for (d1 = 1; d1 <= 9; d1+=2) {    
     for (d2 = 0; d2 <= 9; d2++) {
           number = 1000*d1 + 100*d2 +10*d2+d1 ;

           search(number);
        }
    }

    for (d1 = 1; d1 <= 9; d1+=2) {    
     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0;d3<= 9;d3++) {
           number = 10000*d1+1000*d2+100*d3+10*d2 +d1;
           if(number>c)
        {
            break;
        }
           search(number);
            }
        }
    }

    for (d1 = 1; d1 <= 9; d1+=2) {    
     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0;d3<= 9;d3++) {
           number = 100000*d1+10000*d2+1000*d3+100*d3+10*d2 +d1;

           search(number);
            }
        }
    }

    for (d1 = 1; d1 <= 9; d1+=2) {    
     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0; d3 <= 9; d3++) {
            for(d4=0;d4<=9;d4++)
           number = 1000000*d1+100000*d2+10000*d3+1000*d4+100*d3+10*d2+d1;

           search(number);
            }
        }
    }
    for (d1 = 1; d1 <= 9; d1+=2) {    
     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0; d3 <= 9; d3++) {
            for(d4=0;d4<=9;d4++)
           number = 10000000*d1+1000000*d2+100000*d3+10000*d4+1000*d4+100*d3+10*d2+d1;

           search(number);
            }
        }
    }
    for (d1 = 1; d1 <= 9; d1+=2) {    
     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0; d3 <= 9; d3++) {
            for(d4=0;d4<=9;d4++){
                for(d5=0;d5<=9;d5++){
             number = 100000000*d1+10000000*d2+1000000*d3+100000*d4+10000*d5+1000*d4+100*d3+10*d2+d1;

           search(number);
                 }

             }

            }
        }
    }

    return 0;
}
void search (int a)
{
        int count=0;    
        for(int t=2;t<a;t++)
        {
        if(a%t==0)
        {
            count++;
        }
        }
        if(count==0&&a>=b&&a<=c)
    {
        printf("%d\n",a);
    }
    }

by one_four_three @ 2024-10-22 23:47:51

@Hope_to_grow 求关注Thanks♪(・ω・)

#include<bits/stdc++.h>
using namespace std;
int a,b;
bool isprime(int x){//判断素数 
    if(x==1) return false;
    for(int i=2;i<=sqrt(x);i++){
        if(x%i==0) return false;
    }
    return true;
}
bool isPalindromes(int x){//判断回文 
    int y=x;
    int tmp=0;
    while(y){
        tmp=tmp*10+y%10;
        y/=10;
    }
    if(tmp==x) return true;
    else return false;
}
int main(){
    cin>>a>>b;
    if(b>=9999999) b=9999999;//最大的回文质数不超过9999999 
    if(a%2==0) a+=1; 
    for(int i=a;i<=b;i+=2){
        if(!isPalindromes(i)) continue;//先判回文会快一点 
        else if(isprime(i)) cout<<i<<endl;
    }
    return 0;
} 

by cengzh @ 2024-10-22 23:47:57

哪里都能看到你


by one_four_three @ 2024-10-22 23:48:47

@Hope_to_grow 因为不会筛素数,所以就这样写了


by Eletronic_Monkey @ 2024-10-23 00:08:34

@cengzh 呜呜呜


by cengzh @ 2024-10-23 00:11:12

其实你这个打法不是不行,问题在于你得到的回文数不一定按大小顺序排列,因此输出顺序时会出错,如果要这样打建议用数组存一下再用sort排序啊七七八八的。


by cengzh @ 2024-10-23 00:14:45

另外程序也有很多改进的地方: 1.

void search (int a)
{
        int count=0;    
        for(int t=2;t<a;t++)
        {
        if(a%t==0)
        {
            count++;
        }
        }
        if(count==0&&a>=b&&a<=c)
    {
        printf("%d\n",a);
    }
    }

这一段循环条件写为t*t<=a即可,原因自己想想。if判断出来了可以直接return。还有范围的判断放在前面也可以节省时间。

2. 生成回文数的时候不需要考虑位数为偶数的情况,题解好像有证明。另外没有考虑1不是质数的情况(但数据好像没有卡这一点)


by cengzh @ 2024-10-23 00:22:01

好像生成的回文数也不全,再仔细检查一下吧


by Eletronic_Monkey @ 2024-10-23 00:38:31

@cengzh 好的,感谢大佬!


by StrY_Problems @ 2024-10-23 12:39:17

你这个循环层数也太多了吧,简化简化。


|