[PAT A1015]Reversible Primes
题目描述
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.
输入格式
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.
输出格式
For each test case, print in one line Yes if N is a reversible prime with radix D, or No if not.
输入样例
73 10
23 2
23 10
-2
输出样例
Yes
Yes
No
解析
题目不算复杂,题意就是输入N组数,第一个数是十进制数n,第二个数是进制d,直到遇到一个输入的数为负数为止,如果n是素数,且n在d进制下的翻转后的数,在十进制下也是素数,那么输出Yes,否则输出No。例如:n=23 d=2,23在2进制下式10111,翻转是11101=29,这两个数都是素数,所以输出Yes
我的做法是使用trans函数求出另一个数,并判断他们两个数是否都是素数,我是使用string写的函数,但是我写的trans函数最后一组数据老是过不了,debug了好久还是无果,希望有大神看到了能帮我找找错,或者告诉我最后一组数据的值是多少,感激不尽。
我写的trans函数:
int trans(int n,int r)
{
int temp = 0, ans = 0;do {
temp = temp * 10 + n%r;n /= r;} while (n != 0);string str = to_string(temp);for (int i = 0; i < str.length(); i++) ans = ans * r + str[i] - '0';return ans;
}
感谢评论区“遗弃”的提醒,这里使用的int数据类型存储二进制结果,由于int类型最大是2147483647,也就是只有10位,所以最多只能存储10位二进制数,这个二进制数是很小的,题目给的测试点很有可能会超,各位在做题的时候也要注意这些细节,即最好使用int 数组来存放结果!
后来我是使用了柳神的方法重写了trans函数过掉了最后一组数据:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool isPrime(int n)
{
if (n <= 1) return false;for (int i = 2; i*i <= n; i++) {
if (n%i == 0) return false;}return true;
}
int trans(int n,int d)
{
int len = 0, arr[100];
do{
arr[len++] = n % d;n = n / d;
}while(n != 0);
for(int i = 0; i < len; i++)n = n * d + arr[i];
return n;
}
int main()
{
int n, r;do {
scanf("%d", &n);if (n < 0) break;else {
scanf("%d", &r);int t = trans(n, r);if (isPrime(n) && isPrime(t)) printf("Yes\n");else printf("No\n");}} while (n >= 0);return 0;
}