PAT 甲级 1015 Reversible Primes (20 分)

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;
} 

Guess you like

Origin blog.csdn.net/m0_61974219/article/details/121277600