题意分析:
(1)给定任意一个进制系统下的整数,判断这个数以及它的各位反过来的数在这个进制系统下是否都是素数。
可能坑点:
关于素数的判定有几点需要注意:
(1)在寻找约数的时候,遍历的边界要设置到这个数的开方并取整后的整数(证明:一个数的约数总是在这个数的开方数的左右两侧成对出现,如果左边包括开方数不存在约数,右边一定不存在)
(2)由于浮点数的运算可能存在误差,因此在开方运算后为了保险需要加一个修正floor(sqrt(N)+0.5)
(3)不建议循环内的循环条件设置为i*i<=N,因为在某些int类型的数在很大的情况下相乘可能会导致结果溢出,变成了负数。
#include <iostream>
#include <math.h>
using namespace std;
bool isPrime(int N)
{
if(N==1)return false;
int sqrtNum=floor(sqrt(N)+0.5);
for(int i=2;i<=sqrtNum;i++)
{
if(N%i==0)return false;
}
return true;
}
int getReverseNum(int N,int D)
{
int result=0;
while(N/D!=0)
{
result=result*D+N%D;
N=N/D;
}
result=result*D+N%D;
return result;
}
int main()
{
int N,D;
while(true)
{
cin>>N;
if(N<0)break;
cin>>D;
if(isPrime(N)&&isPrime(getReverseNum(N,D)))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}