7-7 任意进制下的可逆素数 (15分)
任意进制下的可逆素数是这样定义的:它自身是一个素数,当它转换为任意进制之后,把所有数字逆序,得到的新数字的值仍然是一个素数。比如,73在十进制下是一个素数,它在十进制下的逆37也是一个素数,那就称它是十进制下是一个可逆素数。
输入格式:
输入有多行,每行包括两个正整数,数N以及基R,其中N<100000, 1<D<=10, 遇到负数则退出。
输出格式:
对每一行输入,如果是可逆素数,则输出“Yes”,否则输出“No”
s
输入样例:
在这里给出一组输入。例如:
73 10
23 2
23 10
-2
输出样例:
在这里给出相应的输出。例如:
Yes
Yes
No
样例说明:23的二进制是10111,其逆为11101,对应的十进制数是29,所以是可逆素数。
AC代码
#include<bits/stdc++.h>
using namespace std;
int Atoi(string s,int radix) //s是给定的radix进制字符串
{
int ans=0;
for(int i=0;i<s.size();i++)
{
char t=s[i];
if(t>='0'&&t<='9') ans=ans*radix+t-'0';
else ans=ans*radix+t-'a'+10;
}
return ans;
}
string intToA(int n,int radix) //n是待转数字,radix是指定的进制
{
string ans="";
do{
int t=n%radix;
if(t>=0&&t<=9) ans+=t+'0';
else ans+=t-10+'a';
n/=radix;
}while(n!=0); //使用do{}while()以防止输入为0的情况
reverse(ans.begin(),ans.end());
return ans;
}
int main(){
int n,m;
int a[100002]={0};
for(int i=3;i<100002;i+=2){
int flag = 1;
for(int j=2;j<=int(sqrt(i));j++){
if(i%j==0){
flag=0;
break;
}
}
if(flag){
a[i]=1;
}
}
while(1){
cin>>n;
if(n<0){
break;
}
cin>>m;
if(a[n]==0){
cout<<"No"<<endl;
continue;
}
else{
string tmp_str= intToA(n,m);
reverse(tmp_str.begin(),tmp_str.end());
char *str_to_=(char*)tmp_str.c_str();
int data = Atoi(str_to_,m);
if(a[data]==1){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}
return 0;
}