大佬求助,所有测试点都超时了,该怎么优化

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

229074393haishuo @ 2022-10-19 23:07:35

制造回文数是按着题目中的提示来的, 但是全都超时了,求救


#include<stdio.h>
long isz(long x)
{
    for (int i = 2; i < x; i++) 
    {
        if (x % i == 0)
        {
            return 0;
            break;
        }
    }
    return 1;
}
int main()
{
int  d1,d2,d3,d4,a,b,i=0,n=0;
long palindrome[11111],ans[10000];
scanf("%d%d", &a, &b);
    for (d1 = 1; d1 <= 9; d1 += 2)
    {    // 只有奇数才会是素数    
        palindrome[i] =  d1;//(处理回文数...)
        i++;
    }

    for (d1 = 1; d1 <= 9; d1 += 2)
    {    // 只有奇数才会是素数    
               palindrome[i] =  10 * d1 + d1;//(处理回文数...)
                i++;          
    }
    for (d1 = 1; d1 <= 9; d1 += 2)
    {    // 只有奇数才会是素数
        for (d2 = 0; d2 <= 9; d2++)
        {

                palindrome[i] =  100 * d1 + 10 * d2 +  d1 ;//(处理回文数...)
                i++;

        }
    }
    for (d1 = 1; d1 <= 9; d1 += 2)
    {    // 只有奇数才会是素数
        for (d2 = 0; d2 <= 9; d2++)
        {

                palindrome[i] =  1000 * d1 + 100 * d2 + 10 * d2 + d1;//(处理回文数...)
                i++;

        }
    }
    for (d1 = 1; d1 <= 9; d1 += 2) 
    {    // 只有奇数才会是素数
        for (d2 = 0; d2 <= 9; d2++)
        {
            for (d3 = 0; d3 <= 9; d3++) 
            {
                palindrome[i] = 10000 * d1 + 1000 * d2 + 100 * d3 + 10 * d2 + d1;//(处理回文数...)
                i++;
            }
        }
    }
    for (d1 = 1; d1 <= 9; d1 += 2)
    {    // 只有奇数才会是素数
        for (d2 = 0; d2 <= 9; d2++)
        {
            for (d3 = 0; d3 <= 9; d3++)
            {
                palindrome[i] = 100000 * d1 + 10000 * d2 + 1000 * d3 + 100 * d3 + 10*d2+d1;//(处理回文数...)
                i++;
            }
        }
    }
    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++)
                {
                    palindrome[i] = 1000000 * d1 + 100000 * d2 + 10000 * d3 +1000*d4+ 100 * d3 + 10 * d2 + d1;//(处理回文数...)
                    i++;
                }
            }
        }
    }
    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++)
                {
                    palindrome[i] = 10000000 * d1 + 1000000 * d2 + 100000 * d3 + 10000 * d4 + 1000 * d4 + 100 * d3 +10*d2+d1;//(处理回文数...)
                    i++;
                }
            }
        }
    }
    for (int j = 0; j < 11111; j++)
    {
        if (isz(palindrome[j])) 
        {
            ans[n] = palindrome[j];
            n++;
        }
    }
    for (int j = 0; j < n - 1; j++)
        printf("%ld\n", ans[j]);
        return 0;
}```

by Light_az @ 2022-10-20 07:19:05

同志最好把样例先过掉


by WhiteDew_qwq @ 2022-10-20 07:20:20

j<11111那个循环那貌似有超时的风险

还有,要long就long long


by Light_az @ 2022-10-20 07:21:41

long isz(long x)
{
    for (int i = 2; i * i <= x; i++)//稍微优化 
    {
        if (x % i == 0)
        {
            return 0;
            break;
        }
    }
    return 1;
}

by Light_az @ 2022-10-20 07:23:18

@229074393haishuo


by WhiteDew_qwq @ 2022-10-20 07:24:12

打打表得了


by WhiteDew_qwq @ 2022-10-20 07:24:58

@lianzhuo 嗯,这就不会超了


by Light_az @ 2022-10-20 07:26:22

说来惭愧,开O2才过了,把记忆化打一下吧


by 229074393haishuo @ 2022-10-20 11:59:17

好的,谢谢大佬


|