这个题是我今天笔试中遇到的一道题目,蛮有意思的,记录一下:
经过穷举计算,共计是98530929486种解法。。。
package factory; import java.util.ArrayList; import java.util.List; public class Poker24 { static List<PokerCardDTO> pokerCardsList = new ArrayList<>(); static int n = 4;//运算次数标记 static int[] A = new int[4];//存放四个数字 static String[] B = new String[4];//存放字符串型的四个数字,也存放表达式 static int simpleCount = 0;//单次计数 static Long allCount = 0L; //全部计数 public static void calculate4Times(int n) { //判断是否已完成三次运算 if(n == 1) if(A[0] == 24) {//A[0]里面存放的最后的结果 System.out.println(B[0]);//B[0]存放的结果表达式 simpleCount++; allCount = allCount + Long.valueOf(simpleCount); } else {//空的不做处理进行下一条语句 } //从数组中任意取出俩个数的组合 for(int i = 0;i < n;i++) { for(int j = i + 1;j < n;j++) { int a,b; String x,y; a = A[i]; b = A[j]; A[j] = A[n-1];//将最后一位的数字放入下标为j的位置(也就是空出来的那个位置,相当于空出来,) x = B[i]; y = B[j]; B[j] = B[n-1];//与上面同理 A[i] = a + b;//第一个空间保存运算的结果 B[i] = '(' + x + '+' + y + ')';//将第一步运算的表达式放在字符串数组中 calculate4Times(n-1); //减法需要区分顺序 A[i] = a - b; B[i] = '(' + x + '-' + y + ')'; calculate4Times(n-1); A[i] = b - a; B[i] = '(' + y + '-' + x + ')'; calculate4Times(n-1); //乘法 A[i] = a * b; B[i] = '(' + x + '*' + y + ')'; calculate4Times(n-1); //除法和减法一样需区分顺序这里要处理除数为0的情况,因为计算过程中可能出现除数为0的情况 if(b!=0) { A[i] = a / b; B[i] = '(' + x + '/' + y + ')'; calculate4Times(n-1); } if(a!=0) { A[i] = b / a; B[i] = '(' + y + '/' + x + ')'; calculate4Times(n-1); } //当上面四则运算都不满足时 //为了方便进入下一个for循环, 需要将之前的i和j上的值都重新找回 A[i] = a; A[j] = b; B[i] = x; B[j] = y; } } } public static void getCard(Integer card1,Integer card2,Integer card3,Integer card4) { A[0] = card1; A[1] = card2; A[2] = card3; A[3] = card4; //将A,J,Q,K转换为对应的数字 for(int i = 0;i < 4;i++) { if(A[i] == 1) B[i] = "A"; else if(A[i] == 11) B[i] = "J"; else if(A[i] == 12) B[i] = "Q"; else if(A[i] == 13) B[i] = "K"; else B[i] = String.valueOf(A[i]); } for(int i = 0;i < 4;i++) { System.out.println(B[i]); } } //穷举法,将每一种可能装入集合中 public static void initFourPokerCards(){ for(int i =1;i<=13;i++){ for(int j = 1;j<13;j++) for(int k = 1;k<13;k++) for(int l = 1;l<13;l++) { PokerCardDTO pokerCardDTO = new PokerCardDTO(); pokerCardDTO.setCard1(i); pokerCardDTO.setCard2(j); pokerCardDTO.setCard3(k); pokerCardDTO.setCard4(l); pokerCardsList.add(pokerCardDTO); } } } public static void main(String[] args) { initFourPokerCards(); pokerCardsList.stream().forEach(x -> { getCard(x.getCard1(),x.getCard2(),x.getCard3(),x.getCard4()); calculate4Times(n); //调用函数求解 System.out.println("共有"+simpleCount+"种解法"); }); System.out.println("通过穷举,总共有"+allCount+"种解法"); } }