【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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值