目录

​1,题目描述​

​题目大意​

​2,思路​

​3,代码​


1,题目描述

PAT_甲级_1015 Reversible Primes (20分) (C++)【反转质数】_C++

Sample Input:

73 10
23 2
23 10
-2

 

Sample Output:

Yes
Yes
No

题目大意

看了好几遍都没看明白。。。搜索了大神的博客才恍然大悟。

如果⼀个数本身是素数,⽽且在d进制下反转后的数在⼗进制下也是素数,就输出Yes,否 则就输出No ;

 

以23 2为例,十进制23转换为二进制为10111,反转后为11101,再转换为十进制则表示29,由于23和29均为质数,故输出Yes;

 

2,思路

设计两个函数:

  • bool isPrime(int num):判断num是否为指数;
  • int convert(int num, int radix):将num按radix进制转换,并且反转,最后转换成十进制输出;

先接受第一个数num,若为正数则接受下一字段radix,判断num及revNum是否均为质数,是则输出Yes,否则输出No;

 

3,代码

#include<iostream>
#include<math.h>
#include<vector>
using namespace std;

bool isPrime(int num){
if(num == 1) return false;
if(num == 2) return true;
int end = sqrt(num); //判断到sqrt(num)即可
for(int i = 2; i <= end; i++){
if(num % i == 0) return false;
}
return true;
}
int convert(int num, int radix){
vector<int> temp;
int a = 0;
while(num != 0){
temp.push_back(num % radix);
num /= radix;
}
for(int i = 0; i < temp.size(); i++){ //i递增:反转,i递减:正常(手工模拟一下更清楚)
a = a * radix + temp[i]; //利用 秦九韶 算法(寻找迭代公式)
}
return a;
}

int main(){
int num, radix, revNum;
scanf("%d", &num);
while(num > 0){
cin>>radix;
revNum = convert(num, radix);
(isPrime(num) == true && isPrime(revNum) == true) ? cout<<"Yes"<<endl : cout<<"No"<<endl;
cin>>num;
}
return 0;
}