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
思路
这个题目也是很常规的素数类题目,但是20分的题多多少少会挖点小坑,不会让你轻易过的……
首先很坑爹的是,Code::Blocks16.01居然用to_string()函数会报和vsnprinf重定义的错误(我试了一下Dev-C++5.11是没问题的),然后就网上各种找办法(没办法,懒癌是这样的……不想自己再写个函数转成字符串),于是找到了一个法子:打开cmd,输入mingw-get install mingw32-libmingwex-dev
就行了(类似python的pip使用方法),它会自动下载安装的。虽然安装完了之后to_string()能正常使用了,但是Code::Blocks里自己写的函数和变量居然不会再出现自动补全了(心累……算了,将就着用吧)。
题目大意就是,给你一个数N,然后先转换到D进制,在D进制之下,把这个数反转,再回到10进制,让你判断这两个数是不是素数(比如23转换到2进制是10111,反转之后是11101,回到10进制是29,两个都是素数,所以输出Yes)。
然后就是这个题目的【注意点】:
- 因为1不是素数,所以最好在两端都判断一下(事实证明,如果只判断输入的N是否为1是不够的,因为测试点输入的N虽然一开始不是1,但是经过D进制的转换和反转之后,回到10进制又变成了1,所以最好在判断是否是素数的函数里再加一句:如果是1,就return false)。
代码
#include<cstdio>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn = 100010;
int prime[maxn], pNum = 0;
bool p[maxn] = {false};
void FindPrime()
{
for(int i=2; i<maxn; i++)
{
if(p[i]==false)
{
prime[pNum++] = i;
for(int j=i+i; j<maxn; j+=i) p[j] = true;
}
}
}
bool isPrime(int x)
{
if(x==1) return false;
for(int i=2; i<x; i++)
{
if(x%i==0) return false;
}
return true;
}
string TenToD(int x, int D)
{
string tmp;
while(x!=0)
{
tmp += x%D+'0';
x = x/D;
}
reverse(tmp.begin(), tmp.end());
return tmp;
}
int DToTen(string x, int D)
{
int tmp = 0;
for(int i=x.length()-1, j=0; i>=0, j<x.length(); i--, j++)
{
tmp += (x[i]-'0')*pow(D, j);
}
return tmp;
}
int main()
{
FindPrime();
int N, D;
while(cin>>N)
{
if(N<0) break;
cin>>D;
if(N==1||isPrime(N)==false) cout<<"No\n";
else
{
string reN;
if(D==10)
{
reN = to_string(N);
reverse(reN.begin(), reN.end());
int NowReN = stoi(reN);
if(isPrime(NowReN)==true) cout<<"Yes\n";
else cout<<"No\n";
}
else
{
reN = TenToD(N, D);
reverse(reN.begin(), reN.end());
int NowReN = DToTen(reN, D);
if(isPrime(NowReN)==true) cout<<"Yes\n";
else cout<<"No\n";
}
}
}
return 0;
}