小白编程 | PAT Advanced 1015 Reversible Primes(思路分析)

PAT Advanced 1015 Reversible Primes(思路分析)

纠错/交流/讨论:QQ1002726595

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

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

题目大意:

  1. 判断一个十进制数N自身是否是素数
  2. 判断这个十进制数按照所给出进制D转换后的翻转数转换为十进制后是否是素数
  3. 满足以上两个条件的数输出Yes,不满足的输出No

例如:

73是素数,73按照10进制转换后的翻转数为37是素数。故73满足题目要求。

23是素数,23按照2进制转换后为10111,翻转后为11101,再转换为十进制为29,29是素数。故23满足题目要求。

解题思路

  1. 先判断N是否是素数
  2. 再把N按照D转换后变成一个翻转数
  3. 再把3的翻转数转换成十进制
  4. 再判断一次该数是否为素数
  5. 如果同时满足1和4则输出Yes

涉及方法

  1. 判断一个数是否为素数
  2. 将十进制数转换为其他进制D(D<10)
  3. 将其他进制转换为十进制

代码(AC)

#include  //万能头 

using namespace std;
 
/*
 *@function:prime 判断是否为素数 
 *@param:	 int N
 *@return:  flag:判断标志(1代表是素数,0代表不是素数) 
 */
int prime(int N){
	int flag = 1; //flag = 1是素数 
	if(N == 0 || N == 1){
		return 0;
	}else{
		for(int i = 2; i < N; i ++){
			if(N % i == 0){
				flag = 0;
				break;
			}
		}
	}
	return flag;
}

/*
 *@function:converse 其他进制转换为十进制,仅用于D<10 
 *@param:	 vector s:不定长数组,要求存有倒序的进制数(这里解释一下为什么是倒序是,题目要求翻转,根据数学的二除法计算出来本来就是倒序的,所以不需要做翻转了)
 			 int D: 原本进制 
 *@return:  十进制数
 */
int  converse(vector<int> s, int D){
	int n = 0;
	for(int i=0; i < s.size(); i ++){
		n = n + s[i] * pow(D,s.size()-i-1);
	}
	return n;
}

/*
 *@function:getNumber 获取十进制转换为其他进制后翻转过后再转换为十进制的数
 *@param:	 int N:十进制数,int D:进制要求 
 *@return:  十进制数
 */
int getNumber(int N, int D){
	int t = 0,i = 0;
	vector<int> s; 
	while(N){
		s.push_back( N % D);	//除法倒着存的 正好反过来 不需要二次翻转了 
		N = N/D;
		i++;
	}
	int n = s.size();
	if(D == 10){
		//这一段用于把数组变成十进制数 
		for( i = 0; i < n; i ++){
			N = N *10 + s[i];
		}
		return N;
	}else{	
		//用于把非十进制的数转成十进制 
		N = converse(s,D);
		return N;
	}
}


int main(){
	int N,D,t=0; //N:整数 D:进制 t:临时变量 
	vector<int> v1,v2; 	//两个不定长数组用于接收本身和转换后是否为素数的标志 
	bool flag = true;
	while(flag){
		scanf("%d",&N);
		if(N < 0){
			flag = false;
			continue;
		}
		scanf("%d",&D);
		t = prime(N);	//先判断它自己是不是素数 
		v1.push_back(t);
		N = getNumber(N,D);	//获取经过一系列题目要求操作以后的数 
		t = prime(N);	//再判断是否是素数 
		v2.push_back(t); 
	}
	
	for(int j=0;j<v2.size();j++){
		if(v1[j] == 1 && v2[j]){	//如果两个都是素数的话则该数符合要求 
			printf("Yes\n");
		}else{
			printf("No\n");
		}
	}
 	return 0;
}


要点

  1. 万能文件头#include 包含下列所有文件头
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include 
  1. 判断素数这个最基本的函数要会写吧
  2. 如果把vector换成定长数组char s[1000]的话翻转的时候未赋值的下标的值会为0,会出错,所以我觉得不能用定长数组。

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