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

目录

1,题目描述

题目大意

2,思路

3,代码


1,题目描述

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;

扫描二维码关注公众号,回复: 9170320 查看本文章

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;
}
发布了45 篇原创文章 · 获赞 5 · 访问量 2186

猜你喜欢

转载自blog.csdn.net/qq_41528502/article/details/104239096