【PAT甲级】1015 Reversible Primes (20 分)

1015 Reversible Primes

题目描述

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 (<10​5​ ) 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.

Sample Input:

73 10
23 2
23 10
-2

Sample Output:

Yes
Yes
No

思路

本题难度适中,注意由于题目要判断的是以D进制的数字N是不是可逆素数,因此需要计算数字N的D进制的数字的逆序数。

在此,定义一个函数,将数组N的D进制的逆序数字计算出来(返回的是10进制)

char number_D[MAX];//存放转化为D进制的数字,注意这里必须使用字符串来存储转化为D进制的数字
//因为10000的2进制数已经超过了15位,使用int已经无法存储了

int Reverse_Number_Base_Radix_D(int n,int radix)//计算数字n的radix进制数的逆序数
{
    
    
	int index=0;
	while(n!=0)
	{
    
    
		number_D[index++]=(n%radix)+'0';
		n/=radix;
	}//先将n转为radix进制,每一位存在字符串数组中
	//再逆序取出,计算逆序数字
	int sum=0,mul=1;
	for(index--;index>=0;index--)
	{
    
    
		sum+=(number_D[index]-'0')*mul;
		mul*=radix;
	}
	return sum;
}

其中在这里我使用了一个全局变量char number_D[MAX](其实写在函数里面也是可以的),由于题目要求的N最大可能达到10000,而10000的2进制数已经超过了15位,因此需要使用字符串数组来储存转化进制后的数字

之后分别判断原数字N是不是素数,D进制逆序数是不是素数即可

bool Judge_Is_Reverse_Prime(int N,int D)
{
    
    
	if(!Is_Prime(N))//如果本身不是质数,直接返回false
		return false;
	int number=Reverse_Number_Base_Radix_D(N,D);//计算数字N的D进制数的逆序数字
	if(Is_Prime(number))
		return true;
	else
		return false;
}

其中判断一个数是否是素数的函数如下,注意2以下的数字都是不素数

bool Is_Prime(int n)
{
    
    
	if(n<=1)
		return false;
	for(int i=2;i*i<=n;i++)
	{
    
    
		if(n%i==0)
			return false;
	}
	return true;
}

代码

//1015 Reversible Primes
#include<stdio.h>

#define MAX 15

char number_D[MAX];//存放转化为D进制的数字,注意这里必须使用字符串来存储转化为D进制的数字
//因为10000的2进制数已经超过了15位,使用int已经无法存储了

bool Is_Prime(int n);
int Reverse_Number_Base_Radix_D(int n,int radix);
bool Judge_Is_Reverse_Prime(int N,int D);

int main()
{
    
    
	int N,D;
	while(1)
	{
    
    
		scanf("%d",&N);
		if(N<0)return 0;
		scanf("%d",&D);
		if(Judge_Is_Reverse_Prime(N,D))
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

bool Is_Prime(int n)
{
    
    
	if(n<=1)
		return false;
	for(int i=2;i*i<=n;i++)
	{
    
    
		if(n%i==0)
			return false;
	}
	return true;
}

int Reverse_Number_Base_Radix_D(int n,int radix)//计算数字n的radix进制数的逆序数
{
    
    
	int index=0;
	while(n!=0)
	{
    
    
		number_D[index++]=(n%radix)+'0';
		n/=radix;
	}//先将n转为radix进制,每一位存在字符串数组中
	//再逆序取出,计算逆序数字
	int sum=0,mul=1;
	for(index--;index>=0;index--)
	{
    
    
		sum+=(number_D[index]-'0')*mul;
		mul*=radix;
	}
	return sum;
}

bool Judge_Is_Reverse_Prime(int N,int D)
{
    
    
	if(!Is_Prime(N))//如果本身不是质数,直接返回false
		return false;
	int number=Reverse_Number_Base_Radix_D(N,D);//计算数字N的D进制数的逆序数字
	if(Is_Prime(number))
		return true;
	else
		return false;
}

git仓库:Reversible Primes

猜你喜欢

转载自blog.csdn.net/qq_35779286/article/details/98362854