文章目录
一、答案
#include <iostream>
#include <math.h>
using namespace std;
int judge_prime(long int num); //判断质数的函数
long int base_change(long int check_num,int base_system); //十进制转换成其他进制的函数
long int base_change_reverse(long int num,int base_system);//其他进制转换为十进制的函数
long int num_reverse(long int num); //数字翻转函数
int main()
{
long int check_num;
cin>>check_num;
int is_prime=0;
while(check_num>0){ //判断输出是否结束
int base_system=0;
cin>>base_system; //输入进制
is_prime=judge_prime(check_num); //判断原数是否是质数
check_num=base_change(check_num,base_system); //将原十进制数进行进制转换
check_num=num_reverse(check_num); //数字翻转
check_num=base_change_reverse(check_num,base_system); //将其他进制转换回十进制
int is_prime_reverse;
is_prime_reverse=judge_prime(check_num); //进行质数判断
if(is_prime==1 && is_prime_reverse==1){ //输出结果
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
cin>>check_num;
}
}
int judge_prime(long int num) //质数判断函数
{
int prime_tag=1;
if(num==1){
prime_tag=0;
}
for(int i=2;i<=pow(num,0.5);i++){
if(num%i==0){
prime_tag=0;
}
}
return prime_tag;
}
long int base_change(long int check_num,int base_system) //十进制进制转换其他进制(原理可自行百度进制转换)
{
long int result=0;
int round=0;
while(check_num!=0){
result=pow(10,round)*(check_num%base_system)+result;
check_num=check_num/base_system;
round++;
}
return result;
}
long int base_change_reverse(long int num,int base_system) //其他进制转换成十进制
{
long int result=0;
int round=0;
while(num!=0){
result=result+num%10*pow(base_system,round);
num=num/10;
round++;
}
return result;
}
long int num_reverse(long int num) //数字翻转
{
long int result=0;
while(num!=0){
result=result*10+num%10;
num=num/10;
}
return result;
}
二、坑点
本题题目很简单,但是坑点有点多:
1. 质数判断时,要注意1不是质数,2是质数。
2.注意题目中 "A reversible prime in any number system is a prime whose “reverse” in that number system is also a prime.” 中的 also 。不单是变换后的数要是质数,而且原始的数也要是质数。
3. 如果使用 int 类型的变量来存储中间数字转换的结果,像9999的二进制表示这些数就会因为超出表示范围出现错误,所以需要在代码中合理使用long int 。
最后,萌新写文,如有不足,还望指正