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
思路
可逆素数,就是指一个数是素数,它自身reverse之后仍是素数
给N(<10^5)和D(1<D<=10),N代表数字,D代表它在D进制下取reverse
若是可逆素数则输出yes,否则no
C++:
#include "cstdio"
#include "iostream"
#include "cmath"
using namespace std;
//判断是否是素数
bool isPrime(int x){
if (x<=1)
{
return false;
}//要在这里做判断 否则有个测试点过不去 <=1的数都不是素数
int sqr = int(sqrt(x*1.0));//开根数
for (int i=2;i<=sqr;i++)
{
if (x%i==0)
{
return false;
}
}
return true;
}
int main(){
int n,d;
int arr[100001];//储存非10进制的reverse
bool flag=false;
n=0;
while (scanf("%d", &n) != EOF)
{
if (n<0)//小于0
{
break;
}
cin>>d;
if (isPrime(n)==false)//本身就不是素数
{
cout<<"No"<<endl;
continue;
}
int index=0;
do
{
arr[index++]=n%d;
n/=d;
}while(n!=0);
index--;
int reverse=0,j=0;
for(int i=index;i>=0;i--){
reverse+=arr[i]*pow(d,j);//将reverse从arr中转化为数字
j++;
}
flag=isPrime(reverse);
if (flag)
{
cout<<"Yes"<<endl;
}else
cout<<"No"<<endl;
}
return 0;
}