PAT-ADVANCED1015——Reversible Primes

我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED

原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805495863296000

题目描述:

PAT-ADVANCED1015——Reversible Primes_第1张图片

题目翻译:

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++解题报告:

PAT-ADVANCED1015——Reversible Primes_第2张图片

 

你可能感兴趣的:(PAT甲级真题题解)