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 (<10^5) 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, or No if not.
Sample Output:
Yes
Yes
No
Sample Input:
73 10
23 2
23 10
-2
思路
思路不难。没学过C++,想用string练练手,熟悉一下STL。
如果输入的进制是10进制,则将N转为字符串后直接用reverse()
进行倒置,然后判断是否为素数;
如果输入的进制是其他进制,将N化为对应进制的数并存到字符串中,然后reverse()
倒置,倒置完了后再转为10进制真值,进而判断是否为素数。
代码
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <cmath>
using namespace std;
int sushu(int num){
if(num == 1)
return 0;
for(int i=2; i<=sqrt(num); i++){
if(num % i == 0)
return 0;
}
return 1;
}
int reverse_check(int num, int radix){
int real_num_reverse=0;
string real_num_reverse_str;
stringstream ss;
int yushu;
if(radix == 10){
ss << num; ss >> real_num_reverse_str;
reverse(real_num_reverse_str.begin(), real_num_reverse_str.end());
ss.clear();
ss << real_num_reverse_str; ss >> real_num_reverse;
if(sushu(real_num_reverse) == 1)
return 1;
else
return 0;
}
while(num > 0){
yushu = num % radix;
real_num_reverse_str.push_back((yushu + '0'));
num /= radix;
}
real_num_reverse = 0;
for(int i=real_num_reverse_str.size()-1; i>=0; i--){
real_num_reverse += (real_num_reverse_str[i]-'0')*pow(radix, real_num_reverse_str.size()-1-i);
}
if(sushu(real_num_reverse) == 1)
return 1;
else
return 0;
}
int main(){
string str;
int N, D;
while(1){
cin>>N;
if(N<0) break;
cin>>D;
if(sushu(N) == 0){
cout<<"No"<<endl;
continue;
}
if(reverse_check(N, D) == 1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}