1015 Reversible Primes (20分)
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;
}