https://www.patest.cn/contests/pat-a-practise/1015
吐槽:主要是一道素数的题,然后转换一下进制,很简单。

这个是我的代码,之前出现了两个测试点没过,主要是0和1没处理好,后来单独加上了就过了。

#include<cstdio>
#include<cstring>
#include<algorithm> 
#define N 100005
using namespace std;
int p[N];
void prime_table(){
    for(int i = 2;i < N;i++){
        if(p[i] == 0){
            for(int j = i+i;j < N;j+=i){
                p[j] = 1;
            }
        }
    }
} 
bool change(int n, int d){
    int arr[105],t = 0;
    memset(arr,0,sizeof(arr));
    do{
        arr[t++] = n%d;
        n /= d;
    }while(n!=0);
    int sum = 0;
    for(int i = 0;i < t; i++){
        sum =sum*d + arr[i]; 
    }
    if(p[sum] == 0) return true;
    else return false;
}
int main(){
    int n,d;
    while(scanf("%d",&n)!= EOF&& n >= 0){
        scanf("%d",&d);
        fill(p,p+N,0);
        prime_table();
        p[0]=1;
        p[1]=1; 
        if(p[n] == 0 && change(n,d)==true){
            printf("Yes\n");
        }
        else printf("No\n");
    }
    return 0;
}

这是别人写的代码,显然比我的这个简洁而且容易理解,所以也写下面,方便大家参照

#include<cstdio>
#include<cmath>
bool isPrime(int n){
    if(n <= 1) return false;
    int sqr = int(sqrt(n*1.0));
    for(int i=2;i <= sqr;i++){
        if(n % i == 0) 
            return false;
    }
    return true;
} 

int main(){
    int n,d;
    while(scanf("%d",&n)!=EOF&&n>=0){
    scanf("%d",&d);
    if(isPrime(n)==false){
        printf("No\n");
        continue;
    }
    int arr[105],k=0;
    do{
        arr[k++]=n%d;
        n /= d;
    }while(n!=0);
    for(int i=0;i<k;i++){
        n=n*d+arr[i];
    }
    printf("%s",isPrime(n)?"Yes\n":"No\n");     
    }
    return 0;
}