PAT甲级刷题记录——1015 Reversible Primes (20分)

A 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 (<10​5​​ ) 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 Yesif N is a reversible prime with radix D, or Noif not.

Sample Input:

73 10
23 2
23 10
-2

Sample Output:

Yes
Yes
No

思路

这个题目也是很常规的素数类题目,但是20分的题多多少少会挖点小坑,不会让你轻易过的……

首先很坑爹的是,Code::Blocks16.01居然用to_string()函数会报和vsnprinf重定义的错误(我试了一下Dev-C++5.11是没问题的),然后就网上各种找办法(没办法,懒癌是这样的……不想自己再写个函数转成字符串),于是找到了一个法子:打开cmd,输入mingw-get install mingw32-libmingwex-dev就行了(类似python的pip使用方法),它会自动下载安装的。虽然安装完了之后to_string()能正常使用了,但是Code::Blocks里自己写的函数和变量居然不会再出现自动补全了(心累……算了,将就着用吧)。

题目大意就是,给你一个数N,然后先转换到D进制,在D进制之下,把这个数反转,再回到10进制,让你判断这两个数是不是素数(比如23转换到2进制是10111,反转之后是11101,回到10进制是29,两个都是素数,所以输出Yes)。

然后就是这个题目的【注意点】:

  • 因为1不是素数,所以最好在两端都判断一下(事实证明,如果只判断输入的N是否为1是不够的,因为测试点输入的N虽然一开始不是1,但是经过D进制的转换和反转之后,回到10进制又变成了1,所以最好在判断是否是素数的函数里再加一句:如果是1,就return false)。

代码

#include<cstdio>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn = 100010;
int prime[maxn], pNum = 0;
bool p[maxn] = {false};
void FindPrime()
{
    for(int i=2; i<maxn; i++)
    {
        if(p[i]==false)
        {
            prime[pNum++] = i;
            for(int j=i+i; j<maxn; j+=i) p[j] = true;
        }
    }
}
bool isPrime(int x)
{
    if(x==1) return false;
    for(int i=2; i<x; i++)
    {
        if(x%i==0) return false;
    }
    return true;
}
string TenToD(int x, int D)
{
    string tmp;
    while(x!=0)
    {
        tmp += x%D+'0';
        x = x/D;
    }
    reverse(tmp.begin(), tmp.end());
    return tmp;
}
int DToTen(string x, int D)
{
    int tmp = 0;
    for(int i=x.length()-1, j=0; i>=0, j<x.length(); i--, j++)
    {
        tmp += (x[i]-'0')*pow(D, j);
    }
    return tmp;
}
int main()
{
    FindPrime();
    int N, D;
    while(cin>>N)
    {
        if(N<0) break;
        cin>>D;
        if(N==1||isPrime(N)==false) cout<<"No\n";
        else
        {
            string reN;
            if(D==10)
            {
                reN = to_string(N);
                reverse(reN.begin(), reN.end());
                int NowReN = stoi(reN);
                if(isPrime(NowReN)==true) cout<<"Yes\n";
                else cout<<"No\n";
            }
            else
            {
                reN = TenToD(N, D);
                reverse(reN.begin(), reN.end());
                int NowReN = DToTen(reN, D);
                if(isPrime(NowReN)==true) cout<<"Yes\n";
                else cout<<"No\n";
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值