题目描述
任意进制下的可逆素数是这样定义的:它自身是一个素数,当它转换为任意进制之后,把所有数字逆序,得到的新数字的值仍然是一个素数。比如,73在十进制下是一个素数,它在十进制下的逆37也是一个素数,那就称它是十进制下是一个可逆素数。
输入格式:
输入有多行,每行包括两个正整数,数N以及基R,其中N<100000, 1<D<=10, 遇到负数则退出。
输出格式:
对每一行输入,如果是可逆素数,则输出“Yes”,否则输出“No”
输入样例:
在这里给出一组输入。例如:
73 10
23 2
23 10
-2
输出样例:
在这里给出相应的输出。例如:
Yes
Yes
No
样例说明:23的二进制是10111,其逆为11101,对应的十进制数是29,所以是可逆素数。
参考代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int N,D;
int a[100005];
int f()
{
int sum = 0;
int i = 1;
int t2 = 1;
while(N)
{
a[i++] = N%D;
N /= D;
}
for(int j = i-1;j>=1;j--)
{
sum += a[j]*t2;
t2 *= D;
}
return sum;
}
bool isprime(int t1)
{
if(t1==1)
return false;
for(int i = 2;i*i<=t1;i++)
{
if(t1%i==0)
return false;
}
return true;
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
int t;
while(scanf("%d",&N)==1)
{
if(N>0)
scanf("%d",&D);
else
break;
t = f();
if(isprime(t))
cout <<"Yes"<<endl;
else
cout <<"No"<<endl;
}
return 0;
}