PAT A1015 Reversible Primes (20分) [素数 质数 进制转换]
Posted houzm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT A1015 Reversible Primes (20分) [素数 质数 进制转换]相关的知识,希望对你有一定的参考价值。
题目
题目链接
已知一个十进制数n,和基数m,判断 n是否为质数;且n转换为m进制并反转后对应的十进制数是否为质数
解题思路
1 质数判断
2 进制转换
易错点
1 输入的不一定为质数,题目要求判断两个内容: n是否为质数;n转换为m进制并反转后对应的十进制数是否为质数
2 m<=10,所以十进制进行转换后,一定不会出现字母
单词语法
negative 负数
positive 正数
reversible 可逆的
代码
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
");
continue;
}
int temp = r_convert(convert(n,d),d);
if(isPrime(temp))printf("Yes
");
else printf("No
");
}
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
");
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
");
else printf("No
");
}
return 0;
}
以上是关于PAT A1015 Reversible Primes (20分) [素数 质数 进制转换]的主要内容,如果未能解决你的问题,请参考以下文章
A1015 Reversible Primes (20分)(素数判断,进制转换)