PAT甲级真题1015 可逆质数

简介: PAT甲级真题1015 可逆质数

PAT甲级真题1015 可逆质数

给定两个整数 N 和 D,如果 N 是一个质数,并且将 N 转化为 D 进制表示后,再进行反转,得到的新数字转化为十进制表示后如果也是一个质数,则称 N 在 D 进制系统中,是一个可逆质数。

例如,N=73,D=10,则 73 是质数,其十进制表示反转后为 37 也是质数,所以 73 在十进制系统中是一个可逆质数。

N=23,D=2,则 23 是质数,其二进制表示为 10111,反转后得到 11101,转化为十进制后为 29,这也是一个质数,所以 23 在二进制系统中是一个可逆质数。

现在,请你判断所给 N 在 D 进制系统中是否是一个可逆质数。

输入格式

输入包含多组测试数据

每组数据共一行,包含两个整数 N 和 D。

当输入一行为一个负数时,表示输入停止。

输出格式

对于每组数据,输出一个结果,占一行。

如果所给 N 在 D 进制系统中是一个可逆质数,则输出 Yes,否则输出 No。

数据范围

1≤N<10^5,

1<D≤10

输入样例:

73 10
23 2
23 10
-2

输出样例:

Yes
Yes
No

解题思路

此题主要要思考这么几个问题:

  • 怎么判断一个数是质数 推荐文章《判断质数》
  • 怎么转化为10进制 :秦九韶算法

  • 怎么转化为 d 进制

答案都在酒(代码)里了

AC代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
//判断质数
bool isPrime(LL num) {
    if (num <= 3) {
        return num > 1;
    }
    // 不在6的倍数两侧的一定不是质数
    if (num % 6 != 1 && num % 6 != 5) {
        return false;
    }
    LL sqrtc = (LL)sqrt(num);
    for (LL i = 5; i <= sqrtc; i += 6) {
        if (num % i == 0 || num % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}
//转化为10进制
LL getn(char c)
{
    if(c<='9')return c-'0';
    else return c-'a'+10;
}
LL cal_10(string n,LL d){
    LL ret=0;
    for(auto c : n){
        ret = ret*d + getn(c);
    }
    return ret;
}
//转化为d进制
string transd(string n,LL d){
    string ch;//余数
    LL cur = stoll(n);
    string ans="";
    while(cur!=0){
        ch = to_string(cur%d);
        ans = ans + ch;
        cur = cur / d;
    }
    return ans;
    //置反D进制的结果:从上往下看的时候就是它转化结果的字符的置反
}
int main()
{
    string n;
    LL d;
    while(cin>>n>>d){
        //如果本身不是质数直接输出No
        if(!isPrime(stoll(n))){
            cout<<"No"<<endl;
        }else{
            //转化为D进制
            string dnum = transd(n,d);
            //再转换为10进制
            LL tenNum = cal_10(dnum,d);
            //判断是否为质数
            if(isPrime(tenNum))cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }
    return 0;
}


相关文章
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-681 最大公约数和最小公倍数问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-681 最大公约数和最小公倍数问题
43 0
|
6天前
|
算法 Python
Python技术分享:使用穷举法解决鸡兔同笼问题
Python技术分享:使用穷举法解决鸡兔同笼问题
20 1
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-491 回文数和质数
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-491 回文数和质数
23 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-927 A的B的C次方次方
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-927 A的B的C次方次方
39 0
|
6天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-481 阿尔法乘积
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-481 阿尔法乘积
27 0
|
6天前
|
算法
第十四届蓝桥杯集训——for——判断质数/素数
第十四届蓝桥杯集训——for——判断质数/素数
34 0
|
6天前
蓝桥备战--纪念品分组OJ532,贪心证明
蓝桥备战--纪念品分组OJ532,贪心证明
15 0
|
10月前
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
|
11月前
|
存储
蓝桥杯-明码
蓝桥杯-明码
39 0
高职考技能提升教程010期 回文数(对称数)
高职考技能提升教程010期 回文数(对称数)