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
题目的意思是要求一个数是否是可逆素数,步骤如下:
1.求这个数本身是否是素数
2.按照D进制转化
3.翻转
4.把翻转后的这个数再转化成十进制,求这个数是否是素数
这题总的来说是挺简单的,但是坑还是有几个,主要还是在素数上,因为很久没接触了,素数的概念有点忘了,简单的说就是0和1既不是素数也不是合数,其他自然数如果只要两个因数一个是1一个是它本身则这个数是素数,否则就不是。
anyway,代码还是附上(虽然我感觉没什么必要),按照步骤再把坑跳过,这题就是一道很基础的题目。
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
vector<int> arr;
while (true)
{
int a;
cin >> a;
if (a < 0)
{
break;
}
int b;
cin >> b;
arr.push_back(a);
arr.push_back(b);
}
for (int i = 0; i < arr.size() / 2; i++)
{
int a = arr[2 * i];
int b = arr[2 * i + 1];
if (a > 1)
{
int flag = 0;
for (int k = 2; k <= pow(a, 0.5) + 1; k++)
{
if (a%k == 0 && a != k)
{
flag++;
break;
}
}
vector<int> arrNumber;
while (a > 0)
{
arrNumber.push_back(a%b);
a = a / b;
}
int reverseNumber = 0;
for (int j = 0; j < arrNumber.size(); j++)
{
reverseNumber += arrNumber[j] * pow(b, arrNumber.size() - j - 1);
}
if (reverseNumber > 1)
{
for (int k = 2; k <= pow(reverseNumber, 0.5) + 1; k++)
{
if (reverseNumber%k == 0 && reverseNumber != k)
{
flag++;
break;
}
}
if (flag > 0)
{
cout << "No" << endl;
}
else if (flag == 0)
{
cout << "Yes" << endl;
}
}
else if (reverseNumber < 2)
{
cout << "No" << endl;
}
}
else if (a <= 1)
{
cout << "No" << endl;
}
}
system("pause");
}