PAT_甲级_1015 Reversible Primes (20分) (C++)【反转质数】
原创
©著作权归作者所有:来自51CTO博客作者再见萤火虫IT的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
1,题目描述
题目大意
2,思路
3,代码
1,题目描述
Sample Input:
Sample Output:
题目大意
看了好几遍都没看明白。。。搜索了大神的博客才恍然大悟。
如果⼀个数本身是素数,⽽且在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;
}