【题目要求】 将1-20这20个连续的自然数排成一圈,使任意2个相邻的自然数之和为素数。 【解法】 package test; import java.util.HashMap; import java.util.Map; /** * 将1-20这20个自然数排成一圈,使任意2个相邻的自然数之和为素数。 */ public class PrimeNumberRing { private static final int N = 20; private Map<Integer, String> primeNumMap = new HashMap<Integer, String>(); private Map<Integer, String> useNumMap = new HashMap<Integer, String>(); private int[] resArray = new int[N + 1]; public PrimeNumberRing() { primeNumMap.put(2, ""); primeNumMap.put(3, ""); primeNumMap.put(5, ""); primeNumMap.put(7, ""); primeNumMap.put(11, ""); primeNumMap.put(13, ""); primeNumMap.put(17, ""); primeNumMap.put(19, ""); primeNumMap.put(23, ""); primeNumMap.put(29, ""); primeNumMap.put(31, ""); primeNumMap.put(37, ""); resArray[0] = N; resArray[N] = N; useNumMap.put(N, ""); } public void getResult() { realCal(N - 1); for (int num = 1; num <= N; num++) { System.out.print(resArray[num] + " "); } } private boolean realCal(int num) { if (num == 0) { if (primeNumMap.containsKey(resArray[0] + resArray[1])) return true; else return false; } for (int i = N - 1; i > 0; i--) { if (useNumMap.containsKey(i)) continue; if (primeNumMap.containsKey(i + resArray[num + 1])) { resArray[num] = i; useNumMap.put(i, ""); if (realCal(num - 1)) { return true; } else { resArray[num] = 0; useNumMap.remove(i); } } } return false; } public static void main(String[] args) { new PrimeNumberRing().getResult(); } }