import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case int a = in.nextInt(); Set<Integer> primes = new TreeSet<>(); for (int i = 2; i < a; i++) { if (isPrime(i)) { primes.add(i); } } int maxDis = a; int[] result = new int[2]; for (Integer prime : primes) { if (primes.contains((a - prime))) { //之间差距 int dis = Math.abs((a - prime) - prime); if (dis <= maxDis) { maxDis = dis; result[0] = Math.min(a - prime, prime); result[1] = Math.max(a - prime, prime); } } } for (int i : result) { System.out.println(i); } } } public static boolean isPrime(int n) { for (int i = 2; i < n; i++) { // 能被除尽,所以不是素数 if (n % i == 0) { return false; } } return true; } }
这道题关键有两点 1. 先写出确定什么是素数的代码, 一般用for循环,从2到这个数,遍历, 如果% 模==0的都不为素数。 2. 用一个hash,判断一下已经两个数之和等于 目标n的有哪些,然后 用比较法,谁最小就记录下来。 3.最后输出