题目如下:
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 (< 105) 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 Input:
73 10
23 2
23 10
-2
Sample Output:
Yes
Yes
No
题目很简单,只需要先把数字用除k取余法转化为相应的进制,然后正着和反着分别转化为十进制再判断是否为素数,需要注意的是1不是素数。
另外为了避免使用power函数,从低位开始运算,让基数每次自乘。
除k取余法的过程为:
代码如下:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <vector>
using namespace std;
bool isPrime(int input){
if(input == 1) return false;
for(int i = input - 1;i > 1; i--){
if((input % i)==0){
return false;
}
}
return true;
}
int decValueWithVector(vector<int> num, int radix, bool isReverse){
int result = 0;
int m = 1;
if(isReverse == true){
for(int i = num.size() - 1; i >=0; i--){
result += m*num[i];
m*=radix;
}
}else{
for(int i = 0; i < num.size(); i++){
result += m*num[i];
m*=radix;
}
}
return result;
}
int main()
{
int N,D;
vector<int> num_result(0);
bool loop = true;
while(loop){
cin >> N;
if(N < 0){
break;
}
cin >> D;
int shang,yu;
int temp = N;
while(temp != 0){
shang = temp / D;
yu = temp % D;
temp = shang;
num_result.push_back(yu);
}
if(isPrime(decValueWithVector(num_result,D,false))&&isPrime((decValueWithVector(num_result,D,true)))){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
num_result.resize(0);
}
return 0;
}