题解
原题链接
题目大意,给你一个10进制的数N和一个进制D,如果N是素数且N在进制D下的“reverse”也是素数则输出Yes,否则输出No;
样例分析:
23 2
23 在2进制下的数字是10111,“reverse”以下就是11101,也就是10进制下的29,23与29都是素数,输出Yes
解题思路:找到N在进制D下对应的数然后检查两个是不是都是素数,这里检查的方法是用的素数表
AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 100000;
bool isprime[maxn+1];
int primetable[maxn], total=0;
void mktable()
{
memset(isprime,true,sizeof isprime);
for (int i=2; i<=maxn; i++)
{
if (isprime[i] == true)
primetable[total++] = i;
for (int j=0; j<total&&i*primetable[j]<=maxn; j++)
{
isprime[i*primetable[j]] = false;
if (i%primetable[j] == 0)
break;
}
}
}
int reve(int n, int d)
{
int a[20]={0},len=0, revnum=0;
while(n!=0)
{
a[len++] = n%d;
n /= d;
}
for (int i=0; i<len; i++)
revnum = revnum*d+a[i];
return revnum;
}
int main()
{
bool flag = true;
int n, d;
mktable();
isprime[1] = false;
while(flag)
{
scanf("%d",&n);
if (n < 0)
{
flag = false;
continue;
}
scanf("%d", &d);
if (isprime[n]==true && isprime[reve(n,d)]==true)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
end