我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805495863296000
题目描述:
题目翻译:
1015 可翻转的素数
可翻转的素数是一个素数,且其翻转后的数也是一个素数。举个例子,数字73是一个素数,其翻转后的数字37也是一个素数。
现在任给两个正整数N(< 10 ^ 5)和D(1 < D <= 10),你需要输出N在D进制下是否是一个可翻转的素数。
输入格式:
每个输入文件包含多个测试用例。每个测试用例独占一行,其中有两个整数N和D。输入以一个负整数N作为标志。
输出格式:
对每个测试用例,如果N在D进制下是一个可翻转的素数,输出“Yes”,否则输出“No”。
输入样例:
73 10
23 2
23 10
-2
输出样例:
Yes
Yes
No
知识点:素数
本题的题意容易理解错,正确的题意是:
给出正整数N和进制radix,如果N是素数,且N在radix进制下反转后的数在十进制下也是素数,则输出“Yes”,否则输出“No”。
对于例子中的23而言,其本身是素数,转换为2进制为10111,反转后的值是11101,其在十进制下为29,也是素数,所以输出“Yes”。
每个测试用例的时间复杂度是O(sqrt(N))。空间复杂度是O(1)。
C++代码:
#include
#include
#include
#include
#include
using namespace std;
string changeToString(int num, int D); //把10进制的num转换成D进制,以string形式输出
int changeToInt(string s, int D); //把D进制的字符串s转换成10进制数字
bool isPrime(int num);
int main(){
int N, D;
while(true){
scanf("%d", &N);
if(N < 0){
return 0;
}
scanf("%d", &D);
string s = changeToString(N, D);
bool flag1 = isPrime(changeToInt(s, D));
reverse(s.begin(), s.end());
bool flag2 = isPrime(changeToInt(s, D));
if(flag1 && flag2){
printf("Yes\n");
}else{
printf("No\n");
}
}
}
string changeToString(int num, int D){
vector nums;
while(num > 0){
nums.push_back(num % D);
num /= D;
}
string result = "";
for(int i = nums.size() - 1; i >= 0; i--){
result += nums[i] + '0';
}
return result;
}
int changeToInt(string s, int D){
int result = 0;
for(int i = s.length() - 1; i >= 0; i--){
result = result * D + s[i] - '0';
}
return result;
}
bool isPrime(int num){
if(num == 1){
return false;
}
for(int i = 2; i <= sqrt(num); i++){
if(num % i == 0){
return false;
}
}
return true;
}
C++解题报告: