题目原文
A reversible prime in any number system is a prime whose "reverse" in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.
Now given any two positive integers N (<105) and D (1<D≤10), you are supposed to tell if N is a reversible prime with radix D.
Input Specification:
The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.
Output Specification:
For each test case, print in one line Yes
if N is a reversible prime with radix D, or No
if not.
中文翻译
简单来说就是判断一个数自身和在某进制下的相反数是否都是素数,若是输出Yes,若否输出No。
解题思路
先求给定数是否是素数,如果不是的话剩余的就不用求了,节约时间,如果是的话就求出给定数在某进制下的相反数,再求相反数是否是素数。
注意:
1. 1和0不是素数。
2. 题目输出Yes的情况是给定数和原数都是素数。
#include <iostream>
#include <math.h>
using namespace std;
//求出相反数
int trans(int x,int radix){
string res = "";
int i = 0;
//如果是0直接返回0
if (x == 0){
return 0;
}
//按进制转化的算法一位一位加到字符串上
while (x != 0){
char num = x%radix + '0';
x = x/radix;
res += num;
}
//转化为10进制
int rev = 0;
for (int i=0; i<res.length(); i++){
rev = rev*radix + (res[i] - '0');
}
return rev;
}
//求是否是素数
bool isPrime(int x){
//小于等于1则一定不是
if (x <= 1){
return false;
}
//从1循环到x的平方根,若没有的话在x的平方根之后也必定没有
//考虑i=sqrt(x)的情况,一开始忘加=,结果测试点4怎么也过不了……
for (int i=2; i<=sqrt(x); i++){
if (x%i == 0){
return false;
}
}
return true;
}
int main(){
int x,radix;
cin>>x;
//x为负数则结束循环
while(x >= 0){
cin>>radix;
//给定数非素则进行下一个循环
if (!isPrime(x)){
cout<<"No"<<endl;
cin>>x;
continue;
}
if (isPrime(trans(x,radix))){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
cin>>x;
}
}