1015 Reversible Primes
题目大意
每行给出两个数,一个十进制数,一个基数,判断在这个基数情况下,十进制数转为这个基数情况后,逆置,然后转为十进制数,再判断这个十进制数是不是为素数。
算法思想
- 一个函数用来转逆置数,一个函数用来判断是不是为素数
- 注意坑点,1不是素数
- 还有个坑,需要给出的十进制数和逆置后的十进制数都为素数时,才会输出yes
代码
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
bool prime(int x)//判断是否为素数
{
if (x <= 1)
return false;
for (int i = 2; i <= x/2 ; i++)
{
if (x % i == 0)
return false;
}
return true;
}
int sum(int rad, int w)//计算数位
{
int sums = 1;
for (int i = 0; i < w; i++)
sums *= rad;
return sums;
}
int exrev(int x, int rad)//计算逆置数
{
int num = 0;
stack<int>nbe;
stack<int>naf;
while (x != 0)//采用栈
{
nbe.push(x % rad);
x = x / rad;
}
while (!nbe.empty())//进入另一个栈,实现逆置
{
naf.push(nbe.top());
nbe.pop();
}
while(!naf.empty())//依次弹出,计算逆置数
{
num += naf.top() * sum(rad, naf.size() - 1);
naf.pop();
}
return num;
}
int main()
{
vector<int>n;
vector<int>d;
while (1)
{
int a, b;
cin >> a;
if (a < 0)
break;
cin >> b;
n.push_back(a);
d.push_back(b);
}
for (int i = 0; i < n.size(); i++)
{
if (prime(exrev(n[i], d[i])) && prime(n[i]))//需要逆置前后都为素数
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}