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;
}