一道编程题大概意思是:有一副扑克牌,去掉大小王,还剩52张牌,J Q K代表11,12,13。现在随机抽取四张牌,每张牌必须得用到并且每张牌只能用一次,用+ - * / () 看能否实现最后结果可以等于24,例如:输入4 5 6 7 ,输出yes,输入 1 1 2 6 输出yes,输入 1 1 1 1,输出no
现在我的想法是:
1、随机抽取两个数
2、将这两个数进行+ - * / 运算,然后把这个数放到新的数组,将以前的去掉,现在数组就是3个数
3、将然后再回到1,进行递归运算,直到n=1
4、当n=1时,判断结果是否为24,是返回true,否返回false
另外:这样做用到了穷举法的思想,而且这样的算法省略了()的麻烦,应该还有另一种解决办法,就是用后缀表达式来完成,但是我本事不够,目前还没想到该如何实现,还请会的朋友们在下面留下你们的代码:
import java.util.Scanner; /** * * @author 二哈大叔 * */ public class Poker24 { private static int COUNT = 4; //抽取的扑克牌数量 private static double[] number = new double[COUNT]; //扑克牌的数组 private static String[] expression = new String[COUNT]; //表达式数组 public static boolean checkCondition(int n){ //当递归到只有一个数时,判断是否满足条件 if(n == 1){ if(number[0] == 24){ System.out.println(expression[0].substring(1, expression[0].length()-1)); return true; } else return false; } for (int i = 0; i < n - 1; i++) { for(int j = i + 1; j < n; j++){ double tempA = number[i]; double tempB = number[j]; String expreA = expression[i]; String expreB = expression[j]; number[j] = number[n-1]; expression[j] = expression[n-1]; //开始做加法 expression[i] = "("+expreA+"+"+expreB+")"; number[i] = tempA+tempB; if(checkCondition(n-1)) return true; //减法,两种情况,tempA-tempB和tempB-tempA expression[i] = "("+expreA+"-"+expreB+")"; number[i] = tempA-tempB; if(checkCondition(n-1)) return true; expression[i] = "("+expreB+"-"+expreA+")"; number[i] = tempB-tempA; if(checkCondition(n-1)) return true; //乘法 expression[i] = "("+expreA+"*"+expreB+")"; number[i] = tempA*tempB; if(checkCondition(n-1)) return true; //除法,两种情况,tempA/tempB和tempB/tempA,并且保证分母不为0 if(tempB != 0){ expression[i] = "("+expreA+"/"+expreB+")"; number[i] = tempA/tempB; if(checkCondition(n-1)) return true; } if(tempA != 0){ expression[i] = "("+expreB+"/"+expreA+")"; number[i] = tempB/tempA; if(checkCondition(n-1)) return true; } number[i] = tempA; number[j] = tempB; expression[i] = expreA; expression[j] = expreB; } } return false; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入1-13中"+COUNT+"个正整数"); for (int i = 0; i < COUNT; i++) { number[i] = scanner.nextInt(); int x; x = (int)number[i]; expression[i] = String.valueOf(x); } if(checkCondition(COUNT)) System.out.println("yes"); else System.out.println("no"); } }