- 先求出目标值的所有的素数,并且将(素数,(target - 素数)[差值])写入map集合中
- 然后从map中先取得key,根据key查看value是否存在,在看value是否存在key中,就能保证key和value都是素数并且和为target
- 遍历并且保留map的每一对数据的最小距离即可
import java.util.*;
public class Main {
public static void main(String[] args) {
// 任意的两个偶数都可以由两个素数组成,求得组成偶数的两个数组的差值最小的素数对
// 暴力解法, 先求出素数对
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
// 判断是不是素数
int target = scanner.nextInt();
Map<Integer,Integer> map = new HashMap<>();// 用来存放,<素数,差值>
map.put(1,target - 1);
map.put(2,target - 2);
for(int j = 3;j <= target; j++) {
boolean flag = true;
for (int i = 2; i <= Math.sqrt(j); i++) {
if (j % i == 0) // 证明不是素数
{
flag = false;
break;
}
}
if(flag) map.put(j,target - j);
}
// 遍历map,用来找到最小的差值,并且查询差值是否在map的key中,如果存在,则说明其存在素数集合中
int res1 = 0;
int res2 = 1000000;
for(Integer i : map.keySet()){
// 先从map的value中寻找是否存在。
if(map.get(map.get(i)) != null){
// 也就是能找到差值,我们先计算和结果相差多少。
if(res2 - res1 > Math.abs(map.get(i) - i)){
res2 = map.get(i) > i?map.get(i):i;
res1 = map.get(i) < i?map.get(i):i;
}
}
}
System.out.println(res1);
System.out.println(res2);
}
}
}