c艹 TLE 求助!

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

Little_Cabbage @ 2023-03-12 11:34:01

开了O2也过不了

#include <bits/stdc++.h>
#include <set>
using namespace std;
const int N = 1e8;
long long n, m, l, y, sum;
set<long long> s;
bool f[N];

void ff(long long l, long long r) {
    for (int i = l; i <= r; i++) {
        long long x = 0;
        for (int j = 1; j <= i; j *= 10) {
            if (i / j == 0)
                break;
            x++;
        }
        if (x == 1) {
            for (int d1 = 5; d1 <= 9; d1 += 2) {
                sum = d1;
//              cout << sum << ' ';
                s.insert(sum);
            }
        }
        if (x == 2) {
            for (int d1 = 1; d1 <= 9; d1 += 2) {
                sum = 10 * d1 + d1;
//              cout << sum << ' ';
                s.insert(sum);
            }
        }
        if (x == 3) {
            for (int d1 = 1; d1 <= 9; d1 += 2)
                for (int d2 = 0; d2 <= 9; d2++) {
                    sum = 100 * d1 + 10 * d2 + d1;
//                  cout << sum << ' ';
                    s.insert(sum);
                }
        }
        if (x == 4) {
            for (int d1 = 1; d1 <= 9; d1 += 2)
                for (int d2 = 0; d2 <= 9; d2++) {
                    sum = 1000 * d1 + 100 * d2 + 10 * d2 + d1;
//                  cout << sum << ' ';
                    s.insert(sum);
                }
        }
        if (x == 5) {
            for (int d1 = 1; d1 <= 9; d1 += 2)
                for (int d2 = 0; d2 <= 9; d2++)
                    for (int d3 = 0; d3 <= 9; d3++) {
                        sum = 10000 * d1 + 1000 * d2 + 100 * d3 + 10 * d2 + d1;
//                      cout << sum << ' ';
                        s.insert(sum);
                    }
        }
        if (x == 6) {
            for (int d1 = 1; d1 <= 9; d1 += 2)
                for (int d2 = 0; d2 <= 9; d2++)
                    for (int d3 = 0; d3 <= 9; d3++) {
                        sum = 100000 * d1 + 10000 * d2 + 1000 * d3 + 100 * d3 + 10 * d2 + d1;
//                      cout << sum << ' ';
                        s.insert(sum);
                    }
        }
        if (x == 7) {
            for (int d1 = 1; d1 <= 9; d1 += 2)
                for (int d2 = 0; d2 <= 9; d2++)
                    for (int d3 = 0; d3 <= 9; d3++)
                        for (int d4 = 0; d4 <= 9; d4++) {
                            sum = 1000000 * d1 + 100000 * d2 + 10000 * d3 + 1000 * d4 + 100 * d3 + 10 * d2 + d1;
//                          cout << sum << ' ';
                            s.insert(sum);
                        }
        }
        if (x == 8) {
            for (int d1 = 1; d1 <= 9; d1 += 2)
                for (int d2 = 0; d2 <= 9; d2++)
                    for (int d3 = 0; d3 <= 9; d3++)
                        for (int d4 = 0; d4 <= 9; d4++) {
                            sum = 10000000 * d1 + 1000000 * d2 + 100000 * d3 + 10000 * d4 + 1000 + d4 * 100 + d3 + 10 * d2 + d1;
//                          cout << sum << ' ';
                            s.insert(sum);
                        }
        }
    }
}

int main() {
    scanf("%lld%lld", &n, &m);
    ff(n, m);
    f[1] = true;
    for (int i = 2; i <= m; i++)
        if (!f[i])
            for (int j = i * 2; j <= m; j += i)
                f[j] = true;
//  for (int i = 1; i <= m; i++)
//      if (!f[i])
//          cout << i << ' ';
    set<long long>::iterator it = s.begin();
    while (it != s.end()) {
        if (*it > m)
            break;
        if (!f[*it] && *it >= n && *it <= m)
            printf("%lld\n", *it);
        it++;
    }
    return 0;
}

by ljk8886 @ 2023-03-12 11:59:41

参考一下我的代码吧

#include<iostream>
using namespace std;
bool fs(int n)
{
    if(n==1)return false;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)return false;
    }
    return true;
}
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=min(b,9989899);i++)
    {
        if(i%2==0)continue;
        int t=i,w=0;
        while(t>0)
        {
            int h=t%10;
            w*=10;
            w+=h;
            t/=10;
        }
        if(w==i&&fs(i))cout<<i<<endl;
    }
    return 0;
}

by Little_Cabbage @ 2023-03-15 11:50:30

@ljk8886 求注释


by ljk8886 @ 2023-03-16 18:17:06

#include<iostream>
using namespace std;
bool fs(int n)//判断质数函数
{
    if(n==1)return false;//1不是质数
    for(int i=2;i*i<=n;i++)//从2到n的平方根进行枚举
    {
        if(n%i==0)return false;
    }
    return true;
}
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=min(b,9989899/*范围内最大的满足要求数*/);i++)
    {
        if(i%2==0)continue;
        int t=i,w=0;
        while(t>0)//i的倒序数
        {
            int h=t%10;
            w*=10;
            w+=h;
            t/=10;
        }
        if(w==i&&fs(i))cout<<i<<endl;//满足两个要求就输出
    }
    return 0;
}

by Little_Cabbage @ 2023-03-17 22:17:07

@ljk8886 谢谢


|