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 (<105 ) 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