PAT (Advanced Level) 1015 Reversible Primes (20 分)
题意不清的沙雕狗屎题!
给你一个数,判断是否是素数,然后将它转换成d进制,然后再在d进制里逆序,再视作十进制,判断是否是素数。
Python:
import sys
from math import *
#str_in = input()
def is_prime(x):
flag = 1
limit = int(sqrt(1.0 * x))
for i in range(2, limit + 1):
if x % i == 0:
flag = 0
break
return flag
while True:
str_in = input()
flag = 1
a = [int(n) for n in str_in.split()]
x = int(a[0])
if x < 0:
break
d = int(a[1])
flag = flag & is_prime(int(x))
if int(x) == 1:
print('No')
exit(0)
vis = [0]*50
k = 0
x = int(x)
d = int(d)
while int(x) > 0:
k = k + 1
vis[k] = int(x) % d
x //= d
#print(x)
rx = 0
for i in range(1, k + 1):
rx = rx * d + vis[i]
flag = flag & is_prime(rx)
if rx == 1:
print('No')
exit(0)
if flag == 1:
print('Yes')
else:
print('No')
C++:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define ll long long int
#define LL ll
#define INF 0x3f3f3f3f
const int maxn = 1e5 + 10;
int is_prime(LL x) {
int flag = 1;
for (int i = 2; i <= (LL)sqrt(1.0*x); i++) {
if (x % i == 0) {
flag = 0;
break;
}
}
return flag;
}
int main()
{
string str;
int d;
while (cin >> str) {
int flag = 1;
if (str[0] == '-') break;
cin >> d;
int x = 0;
LL rx = 0;//x在d进制下的倒置
int len = str.length();
for (int i = 0; i < len; i++) {
x = x * 10;
x += str[i] - '0';
}
flag = flag & is_prime(x);//计算x是否为素数
if (x <= 1) {//1不是素数
puts("No");
return 0;
}
int vis[100]; int k = 0;
while (x) {
vis[++k] = x % d;
x /= d;
}
for (int i = 1; i <= k; i++) {
rx *= d;//之前一直乘10,感觉这个题表意不清,且没什么意思
rx += vis[i];
}
if (rx <= 1) {//1不是素数
puts("No");
return 0;
}
flag = flag & is_prime(rx);
if (flag) {
puts("Yes");
}
else puts("No");
}
return 0;
}
//_CRT_SECURE_NO_WARNINGS