题目如下:
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; }