1015 Reversible Primes (20 分)
题目描述
判断一个十进制数字是否为素数且其 D
进制的反向的十进制是否为素数,如果是则输出 Yes
,否则输出 No
。
问题分析
总共有两个模块。第一个模块是素数判断;第二个模块是进制间的相互转换。
问题解决流程
① 题目输入的为一个十进制数 N
和介于 2~10
的进制 D
,首先需要判断 N
是否为素数,如果是,则跳转到②;否则跳转到④;
② 将十进制数 N
转换为 D
进制 T
,将 T
进行反转并转换成十进制 T'
;
③ 如果十进制 T'
为素数则输出 Yes
,结束;如果不是素数,则跳转到 ④;
④ 输出 No
,结束。
代码实现
#include<iostream>
#include<cmath>
using namespace std;
int const MAX=10000;
char ans[MAX];
long length;
//十进制num转成D进制
void num2D(long num,long D){
length=0;
while(num>0){
ans[length++]='0'+num%D;
num/=D;
}
}
//D进制的反向转十进制
long d2num(long D){
long num=0;
long p=1;
for(int i=length-1;i>=0;--i){
num+=(ans[i]-'0')*p;
p*=D;
}
return num;
}
//判断是否为素数 十进制
bool isPrime(long num){
if(num==1) return false;
else if(num==2) return true;
if(num%2==0) return false;
for(int i=3;i<=sqrt(num);i+=2)
if(num%i==0) return false;
return true;
}
int main(void){
long N,D;
while(true){
cin>>N;
if(N<0) break;
cin>>D;
if(isPrime(N)){
num2D(N,D);
if(isPrime(d2num(D))) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}else{
cout<<"No"<<endl;
}
}
return 0;
}