1015 Reversible Primes
思路:
我的思路比较暴力,就是直接判断翻转之前和翻转之后的数字是否都为素数,如果都是就输出"Yes",否则输出"No"。
注意点:
- 题中的要求是在翻转之前和翻转之后必须都为素数才能输出
Yes
; - 关于翻转的规则是按照输入的数制翻转的,例如输入为
23 2
,则首先要将23转换为2进制10111
,再将10111
翻转; - 关于素数的判断:1既不是素数也不是合数,所以1不是素数,刚开始测试点1没有通过就是因为没有判断数字是否为1,后来改过来之后测试点就通过了。
另外:
刚才查的时候发现Java有封装好的数制转换和翻转,打扰了。
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class ReversiblePrimes {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
List<Integer> input = new ArrayList<>();
List<Integer> reverse = new ArrayList<>();
String[] line = bufferedReader.readLine().split(" ");
while (Integer.parseInt(line[0]) >= 0) {
String N = line[0];
int D = Integer.parseInt(line[1]);
if (D == 10) {
input.add(convertToTen(N, 10, 0));
reverse.add(convertToTen(N, 10, 1));
} else {
input.add(convertToTen(N, 10, 0));
reverse.add(convertToTen(TenToRadix(N, D), D, 1));
}
line = bufferedReader.readLine().split(" ");
}
for (int i = 0; i < input.size(); i++) {
if (judgePrime(input.get(i)) && judgePrime(reverse.get(i))) {
System.out.println("Yes");
} else System.out.println("No");
}
}
private static boolean judgePrime(int num) {
if (num == 1) return false;
for (int i = 2; ; i++) {
if (i * i > num)
break;
else if (num % i == 0)
return false;
}
return true;
}
private static String TenToRadix(String num, int D) {
StringBuilder result = new StringBuilder("");
int n = convertToTen(num, 10, 0);
while (n != 0) {
result.insert(0, n % D);
n /= D;
}
return result.toString();
}
private static int convertToTen(String num, int D, int flag) {
int tempRadix = 1;
int result = 0;
if (flag == 0) //不翻转
for (int i = num.length() - 1; i >= 0; i--) {
result += tempRadix * (num.charAt(i) - '0');
tempRadix *= D;
}
if (flag == 1) //翻转
for (int i = 0; i < num.length(); i++) {
result += tempRadix * (num.charAt(i) - '0');
tempRadix *= D;
}
return result;
}
}