题目大意:
输入n,判断n和n转换为d进制并翻转后再还原为十进制后的数字是否都为素数,输入结束的标志为n是负数。
解题思路:
首先构造了一个十万的素数表,为了方便查找我用SET存了一下,当然用数组二分查也很方便,然后就是按照朴素的进制转换思路写就可以了,另外发现PTA编译器居然不认ATOi函数,真是标准C++啊。。。
代码如下:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<stdlib.h>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
set<int> p;
void get_prime()//构造了十万以内的素数表
{
int book[100010]={0};
set<int>:: iterator iter;
for(int i=2;i<=100001;i++)
{
if(book[i]==0)
{
p.insert(i);
}
for(iter=p.begin();i*(*iter)<=100001&&iter!=p.end();iter++)
{
book[i*(*iter)]=1;
if(i%(*iter)==0)break;
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
// freopen("test.txt","r",stdin);
// freopen("output.txt","w",stdout);
get_prime();
int n,d;
while(cin>>n&&n>=0)
{
cin>>d;
int position[1010]={0},cur=0,n1=n;//保存转换为d进制后的对应位上的数字
while(n1)//进制转换
{
position[cur++]=n1%d;
n1/=d;
}
int k=0;
for(int i=cur-1;i>=0;i--)
{
k+=position[i]*pow(d,cur-i-1);//还原为十进制
}
if(p.count(n)&&p.count(k))cout<<"Yes"<<endl;//原数字与“翻转”后的数字是否在集合中
else cout<<"No"<<endl;
}
return 0;
}