1015 Reversible Primes (20 分)
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, orNo
if not.Sample Input:
73 10 23 2 23 10 -2
Sample Output:
Yes Yes No
题目大意:
给定一个十进制数和指定进制,判断这个十进制数,和转为指定进制后再逆转回文的数,这两个数是否都为素数。
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
//解题思路:
//主要是进制之间和字符串与数之间的转换
const int maxn = 1e5 + 5;
//打表记录素数
bool pri[maxn];
//埃式筛法
void init()
{
pri[1] = pri[0] = true;
for(int i = 2; i * i <= maxn; i++)
{
if(!pri[i])
for(int j = i * i; j <= maxn; j += i)
{
pri[j] = true;
}
}
}
//转化成指定进制的字符串,且为逆转状态
string torad(int x, const int &rad)
{
string t = "";
while(x)
{
t += x % rad + '0';
x /= rad;
}
return t;
}
//对指定进制转化为十进制
int toten(const string &s, const int &rad)
{
int sum(0), base(1);
for(int i = s.size() - 1; i >= 0 ; i--)
{
sum += (s[i] - '0') * base;
base *= rad;
}
return sum;
}
int main()
{
init();
int n, rad;
while(scanf("%d %d", &n, &rad) == 2 && n >= 0)
{
// 对于每个输入判断是否为素数
if(!pri[n])
{
// 如果是,转为该进制逆转
string s = torad(n, rad);
// 转回十进制
int t = toten(s, rad);
// 判断
if(!pri[t])
{
printf("Yes\n");
continue;
}
}
printf("No\n");
}
return 0;
}