本题思路:1、记录N是否为素数的判断(开始遗漏了这处的判断)
2、将N转换为d进制记录在数组中
3、反转,实质是数组从下标0处开始遍历
4、将反转后的d进制转换为十进制
5、对转换后的十进制判断是否是素数,同时,结合最开始对N是否为素数的判断,只有二者皆为素数时,该数才是反转素数,否则不是.
注意点:1是非素数,需要进行特判
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
int store[20];
bool judgePrime(int sample){
if(sample==1)return false; //特判1为非素数
int temp=(int)sqrt(1.0*sample);
for(int i=2;i<=temp;i++){
if(sample%i==0)return false;
}
return true;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,d;
bool isPrime=false; //记录该数反转前是否是素数
while(1){
int j=0,res=0,exp=0;
scanf("%d",&n);
if(n<0)break;
isPrime=judgePrime(n);
scanf("%d",&d);
do{
store[j]=n%d;
n/=d;
j++;
}while(n!=0);
for(int i=j-1;i>=0;i--){
int temp=1;
for(int e=1;e<=exp;e++)temp*=d;
res+=temp*store[i];
exp++;
}
if(isPrime&&judgePrime(res))printf("Yes\n");
else printf("No\n");
}
return 0;
}
算法笔记中比较好的点:若n本身便是非素数,则输出No,直接跳过本次循环;通过scanf("%d",&n)!=EOF来结束输入.
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
int store[20];
bool judgePrime(int sample){
if(sample==1)return false; //特判1为非素数
int temp=(int)sqrt(1.0*sample);
for(int i=2;i<=temp;i++){
if(sample%i==0)return false;
}
return true;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,d;
while(scanf("%d",&n)!=EOF){
if(n<0)break;
int j=0,res=0,exp=0;
scanf("%d",&d);
if(!judgePrime(n)){ //判断反转前是否是素数,若反转前不是素数,则无需后续操作,直接输出No即可
printf("No\n");
continue;
} //注意点:该if条件判断要写在输入d之后,否则在这直接退出本循环,将导致之后的d停滞输入,放到了下一个循环中
do{
store[j]=n%d;
n/=d;
j++;
}while(n!=0);
for(int i=j-1;i>=0;i--){
int temp=1;
for(int e=1;e<=exp;e++)temp*=d;
res+=temp*store[i];
exp++;
}
if(judgePrime(res))printf("Yes\n");
else printf("No\n");
}
return 0;
}