主要考察
1、是否是素数
2、10进制转r进制(辗转相除)
3、r进制转10进制(类似多项式存储乘就行了)
比较简单,但还是比较恶心的(个人觉得),又是题目说不清楚的一题。。。骂人了都
注意事项:
1、本题计算过程简单,但翻译令我迷茫:题意读清楚很重要(反正我是懵逼了)对于一个10进制的数,如果它是一个素数,把它转换成d进制,再将这个序列逆序排,这个逆序的d进制数的10进制表示如果也是素数,则输出Yes,否则No
2、测试点1 妈蛋,1不是素数也不是合数
//本题计算过程简单,但翻译令我迷茫:题意读清楚很重要(反正我是懵逼了)对于一个10进制的数,如果它是一个素数,把它转换成d进制,再将这个序列逆序排,这个逆序的d进制数的10进制表示如果也是素数,则输出Yes,否则No
//测试点1 妈蛋,1不是素数也不是合数
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
bool is_prime(int a){
if(a==0) return false;
if(a==1) return false;
bool flag=true;
for(int i=2;i<=sqrt(a);i++){
if(a%i==0) flag=false; //只要有一个就说明不是素数
}
return flag;
}
int r_to_10(string N,int radix){
int sum=0;
int i=0;
for(auto it=N.begin();it!=N.end();it++,i++){
sum+=(*it-'0') * pow(radix,N.size()-i-1);
}
return sum;
}
bool rev_is_prime(int N,int radix){
//1先转成D进制的数组 直接返回已经反转好的10_to_r
string rev="";
while(N!=0){
rev+=to_string(N%radix);
N=N/radix;
}
//2 转10进制
int a=r_to_10(rev,radix);
//直接判断
return is_prime(a);
}
int main()
{
while(1){
int N;
cin>>N;
if(N<0) break;
int D;
cin>>D;
if( !is_prime(N) ) cout<<"No"<<endl;
else if( !rev_is_prime(N,D) ) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}