88分c++最后一点T求助!

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

zhongboxuan123 @ 2022-11-13 08:09:17

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8;
int prime[maxn],cnt;
bool st[maxn];
void ol_prime(int n){
    for(int i = 2;i <= n;i++)
    {
        if(!st[i])
        {
            prime[++cnt] = i;//i是素数,存储到prime数组中 
        }
        for(int j = 1;prime[j] <= n / i;j++) 
        {
            st[prime[j] * i] = true;//将i的质数倍数进行标记
            if(i % prime[j] == 0)
            {
                break;
             } 
        }
    }
    return ;
}
bool pd_hw(int x)
{

    int y=x,num=0;//int y=x,防止x被改变
    while (y!=0)
    {
        num=num*10+y%10;//上一次数字的记录进位再加上下一位数
        y/=10;
    } 
    if (num==x) return 1;
    else return 0;
}
int main(){
    int n,m;
    cin>>m>>n;
    ol_prime(n);
    for(int i=1;i<=cnt;i++){
        if(pd_hw(prime[i]) && prime[i]>=m && prime[i]<=n){
            cout<<prime[i]<<endl;
        }
    }

    return 0;
}

我这里选择了线性筛和回文判断,然后最后一点T,换了printf和scanf开了o2过了


by __er @ 2022-11-13 08:16:37

@zhongboxuan123 我用的生成回文数过的,你这不是正解吧,只是艹过去了


by Hans4103423 @ 2022-11-13 08:34:30

#include <bits/stdc++.h>
using namespace std;
bool prime[10000000];
int s,e;
int main(){
    scanf("%d%d",&s,&e);
    if(e > 9999999){
        e = 9999999;
    }
    int sqrt_e = int(sqrt(e));
    for(register int i = 2 ; i <= sqrt_e ; i ++){
        if(!prime[i]){
            for(register int j = i * i ; j <= e ; j += i){
                    prime[j] = 1;
            }
        }
    }   
    for(register int i = s ; i <= e ; i ++){
        if(!prime[i]){
            int re = 0,k;
            k = i;
            while(k != 0){
                re = re * 10 + k % 10;
                k = k / 10;
            }
            if(re == i){
                printf("%d\n",i);
            }
        }
    }
} 

8~10行,判断有没有超范围(其实只有一千万的范围)


|