1. 程式人生 > 實用技巧 >PAT A1015 Reversible Primes (20分) [素數 質數 進位制轉換]

PAT A1015 Reversible Primes (20分) [素數 質數 進位制轉換]

題目

題目連結
已知一個十進位制數n,和基數m,判斷 n是否為質數;且n轉換為m進位制並反轉後對應的十進位制數是否為質數

解題思路

1 質數判斷
2 進位制轉換

易錯點

1 輸入的不一定為質數,題目要求判斷兩個內容: n是否為質數;n轉換為m進位制並反轉後對應的十進位制數是否為質數
2 m<=10,所以十進位制進行轉換後,一定不會出現字母

程式碼

Code 01

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
/*
	1 進位制轉換
	2 質數判別
*/
// 十進位制轉換到其他進位制 - 10進位制以內
string  convert(int x,int r) {
	string y;
	int temp;
	do {
		temp=x%r; //題目已知temp一定小於10
		if(temp>=10)y+=temp-10+'A';
		else y+=temp+'0';
		x/=r;
	} while(x!=0);
	return y;//不需反轉,因為題目中就是求反轉後是否是質數
}
// 其他進位制轉十進位制
int r_convert(string y, int r) {
	int index =0,sum=0,temp;
	for(int i=y.length()-1; i>=0; i--) {
		temp = isdigit(y[i])?y[i]-'0':y[i]-'A'+10;
		sum+=temp%10*pow(r,index++);
	}
	return sum;
}
// 素數判別
bool isPrime(int x){
	if(x<=1)return false;
	int sqr = (int)sqrt(1.0*x); 
	for(int i=2;i<=sqr;i++){
		if(x%i==0)return false;
	}
	return true;
} 
int main(int argc,char * argv[]) {
	int n,d;
	while(1) {
		scanf("%d",&n);
		if(n<0)break;
		scanf("%d",&d);
		if(!isPrime(n)){
			printf("No\n");
			continue;
		}
		int temp = r_convert(convert(n,d),d);
		if(isPrime(temp))printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

Code 02

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
bool isPrime(int n) {
	if(n<=1)return false;
	int sqr=(int)sqrt(1.0*n);
	for(int i=2; i<=sqr; i++) {
		if(n%i==0)return false;
	}
	return true;
}
int main(int argc, char * argv[]) {
	int n,radix;
	while(scanf("%d",&n)!=EOF) {
		if(n<0)break;
		scanf("%d",&radix);
		if(isPrime(n)==false){
			printf("No\n");
			continue;
		}
		// 進位制轉換
		int index=0,d[111]={0};
		do{
			d[index++]=n%radix;
			n/=radix;
		} while(n!=0);
		for(int i=0;i<index;i++){
			n=n*radix+d[i];
		}
		if(isPrime(n))printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}