PAT甲级 1015 Reversible Primes

题目原文

reversible prime in any number system is a prime whose "reverse" in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.

Now given any two positive integers N (<105) and D (1<D≤10), you are supposed to tell if N is a reversible prime with radix D.

Input Specification:

The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.

Output Specification:

For each test case, print in one line Yes if N is a reversible prime with radix D, or No if not.

中文翻译

简单来说就是判断一个数自身和在某进制下的相反数是否都是素数,若是输出Yes,若否输出No。

解题思路

先求给定数是否是素数,如果不是的话剩余的就不用求了,节约时间,如果是的话就求出给定数在某进制下的相反数,再求相反数是否是素数。

注意:

1. 1和0不是素数。

2. 题目输出Yes的情况是给定数和原数都是素数。

#include <iostream>
#include <math.h>

using namespace std;

//求出相反数
int trans(int x,int radix){
    string res = "";
    int i = 0;
    //如果是0直接返回0
    if (x == 0){
        return 0;
    }
    //按进制转化的算法一位一位加到字符串上
    while (x != 0){
        char num = x%radix + '0';
        x = x/radix;
        res += num;
    }
    //转化为10进制
    int rev = 0;
    for (int i=0; i<res.length(); i++){
        rev = rev*radix + (res[i] - '0');
    }
    return rev;
}

//求是否是素数
bool isPrime(int x){
    //小于等于1则一定不是
    if (x <= 1){
        return false;
    }
    //从1循环到x的平方根,若没有的话在x的平方根之后也必定没有
    //考虑i=sqrt(x)的情况,一开始忘加=,结果测试点4怎么也过不了……
    for (int i=2; i<=sqrt(x); i++){
        if (x%i == 0){
            return false;
        }
    }
    return true;
}

int main(){
    int x,radix;
    cin>>x;
    //x为负数则结束循环
    while(x >= 0){
        cin>>radix;
        //给定数非素则进行下一个循环
        if (!isPrime(x)){
            cout<<"No"<<endl;
            cin>>x;
            continue;
        }
        if (isPrime(trans(x,radix))){
            cout<<"Yes"<<endl;
        }
        else{
            cout<<"No"<<endl;
        }
        cin>>x;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值