两种解法

(1)穷举所有小于n的素数,找出差值最小的一组

具体实现代码:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        // 找出1-n之间的所有质数
        List<Integer> prime = new ArrayList<>();
        boolean[] isPrime = new boolean[n+1];
        for (int i = 2; i<= n; i++) {
            if (!isPrime[i]) {
                prime.add(i);
            }
            for (int j = 0; j < prime.size(); j++) {
                if (prime.get(j) * i > n) {
                    break;
                }
                isPrime[i * prime.get(j)] = true;
                if (i % prime.get(j) == 0) {
                    break;
                }
            }
        }
        int min = Integer.MAX_VALUE;
        int ans1 = 0, ans2 = 0;
        for (int i = 0; i < prime.size(); i++) {
            int temp = n - prime.get(i);
            if (prime.contains(temp)) {
                int diff = Math.abs(temp - prime.get(i));
                if (min >= diff) {
                    min = diff;
                    ans1 = prime.get(i);
                    ans2 = temp;
                }
            }
        }
        min = Math.min(ans1, ans2);
        int max = Math.max(ans1, ans2);
        System.out.println(min);
        System.out.println(max);
    }
}

(2)从中间向两边扩展查找素数

从数字n中间位置开始往左右两边查找素数,因为一个偶数可以由两个素数组成,那么这两个素数必定是一个小于n/2,一个大于n/2情况。

那么从n/2位置,开始向左右两边查找第一次出现的素数,则这两个素数必定是差值最小的。

具体代码如下所示:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        // 从中间开始,向左右两边查找质数即可结束
        int mid = n / 2;
        int left = mid, right = mid;
        while (!isPrime(left) || !isPrime(right)) {
            left--;
            right++;
        }
        System.out.println(left);
        System.out.println(right);
    }
    public static boolean isPrime(int num) {
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}