题目说明:输入一个十进制的数number,和进制radix,先转换成这个进制下的数,把它反过来,再转换成十进制下的数rev,若number和rev都是素数,输出“Yes”,否则输出“No”。这个题目感觉题意不是很明确,百度后才看懂了...
注意点:1不是素数也不是合数,要做特殊判断。
代码:
#include<iostream>
#include<fstream>
using namespace std;
bool isPrime(int number);
int reverseDecimal(int number,int r);
/*by dayu */
int number,radix;
int main(){
#ifdef ONLINE_JUDGE
#else
ifstream cin("aa.txt");
#endif
while(1){
cin>>number;
if(number>0)
{
cin>>radix;
//判断原数是否是素数
if(isPrime(number)){
int rev=reverseDecimal(number,radix);
//判断反过来的数是否是素数
if(isPrime(rev)){
printf("Yes\n");
}
else{
printf("No\n");
}
}
else{
printf("No\n");
}
}
//负数结束输入
else
break;
}
return 0;
}
int reverseDecimal(int number,int r){
//进制转换并且取反
int temp=number;
int len=0;//进制转换后的数字字符串长度
char numstr[100000]={0};//取反后的字符串
for(int i=0;temp>0;i++){
numstr[i]=temp%r+48;
temp=temp/r;
len++;
}
//转换成十进制
int decimal=0;
for(int i=0;i<len-1;i++){
decimal+=numstr[i]-48;
decimal*=r;
}
decimal+=numstr[len-1]-48;
return decimal;
}
bool isPrime(int number){
if(number<=1){
//test1:0,1不是素数也不是合数
return false;
}
for(int i=2;i<number;i++){
if(number%i==0){
return false;
}
}
return true;
}