题目描述:偶数由两个素数构成,且素数差值最小。
比如:
输入:20
输出:7 13
思路:
1、编写求素数的方法。
2、求出偶数的所有素数,放入Map集合中。
3、遍历集合求出差值最小的。
1、编写求素数的方法。
/***
* @param num
* @return true为素数
*/
public boolean isPrimeNumber(int num) {
boolean flag = true;
if(num==1) {
flag = false;
}else if(num==2){
flag = true;
}else {
for(int i=2;i<num;i++) {
if(num%2==0) {
flag = false;
}
}
}
return flag;
}
2、求出偶数的所有素数,放入Map集合中。
/**
* @param num
* @return
*/
public Map<Integer, Integer> getAllPrime(int num) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 2; i < num; i++) {
if (isPrimeNumber(i) && isPrimeNumber(num - i)) {
map.put(i, num - i);
}
if(map.containsKey(map.get(i))) {
map.remove(i);
}
}
return map;
}
3、遍历集合求出差值最小的。
public List<Integer> getRes(int evenNumber) {
List<Integer> list = new ArrayList<>();
Map<Integer, Integer> map = getAllPrime(evenNumber);// 7 13 17 3
int res = -1;
int temp = 0;
for (int key : map.keySet()) {
Integer val = map.get(key);
//差值
int num = getNum(key, val);
if (res == -1) {
res = num;
temp = key;
} else {
res = res < num ? temp : key;
}
}
list.add(res);
list.add(map.get(res));
return list;
}
/**
* 求两个数的差值
* @param a
* @param b
* @return
*/
public int getNum(int a, int b) {
if (a > b) {
return a - b;
}
return b - a;
}
测试:
public static void main(String[] args) {
Test2 test2 = new Test2();
List<Integer> res = test2.getRes(20);
System.out.println(res);
}