题目要求:

用户输入4位个位数(1~9),四个数之间只能通过+,-,*,/运算进行连接
请输出四则运算表达式,其求值结果为24。然后输出所有求值结果为24的组合。
你能不能不通过四重循环来产生这4个参与运算的数。

代码如下:

package ergodic;import java.util.*;
/*** @ Author     :heywecome* @ Date       :Created in 20:32 2018/12/20* @ Description:${description}* @ Modified By:* @Version: $version$*/
public class TwentyFour {// 用户输入4位个位数(1~9),四个数之间只能通过+,-,*,/运算进行连接,请输出四则运算表达式,// 其求值结果为24。然后输出所有求值结果为24的组合。你能不能不通过四重循环来产生这4个参与运算的数。static final String PLUS = "+";static final String DIVIDE = "-";static final String MULTIPLY= "*";static final String SUBSTRACT = "/";static ArrayList resultList = new ArrayList();static ArrayList operatorList = new ArrayList();static String[] operator = {PLUS,DIVIDE,MULTIPLY,SUBSTRACT}; // 操作符的排列public static void findAllSolution(int[] nums){perm(nums,0,nums.length-1); // 产生数的排列perm(operator,0,operator.length-1);for(int i = 0; i < nums.length; i++){ // 四个数产生不同的排列for(int j = 0; j < operatorList.size(); j++){String formula = new String();int[] numsTemp = (int[]) resultList.get(i);String[] operatorTemp = (String[])operatorList.get(j);// 加括号的第一种情况: (a+b)+(c+d)formula += "("+numsTemp[0]+ operatorTemp[0]+numsTemp[1]+")"+ operatorTemp[1]+"("+numsTemp[2]+operatorTemp[2]+numsTemp[3]+")";if(evaluateExpression(formula) == 24){System.out.println(formula);}formula = "";// 加括号的第二种情况:  ((a+b)+c)+d,formula += "(("+numsTemp[0]+ operatorTemp[0]+numsTemp[1]+")"+ operatorTemp[1]+numsTemp[2]+")"+operatorTemp[2]+numsTemp[3];if(evaluateExpression(formula) == 24){System.out.println(formula);}formula = "";// 加括号的第三种情况: (a+(b+c))+dformula += "("+numsTemp[0]+operatorTemp[0]+ "(" +numsTemp[1]+operatorTemp[1]+numsTemp[2]+"))"+operatorTemp[2]+numsTemp[3];if(evaluateExpression(formula) == 24){System.out.println(formula);}}}}/** 计算表达式 */public static int evaluateExpression(String expression) {// 创建操作数的stackGenericStack<Integer> operandStack = new GenericStack<Integer>();// 创建操作符的stackGenericStack<Character> operatorStack = new GenericStack<Character>();// 真正的操作数和操作符// 去掉首尾空格java.util.StringTokenizer tokens = new java.util.StringTokenizer(expression, "()+-/*", true);// 步骤1:搜索tokenwhile (tokens.hasMoreTokens()) {String token = tokens.nextToken().trim(); // 压缩一个tokenif (token.length() == 0) // 为空时continue; // 返回到循环压缩下一个字符else if (token.charAt(0) == '+' || token.charAt(0) == '-') {// Process all +, -, *, / in the top of the operator stack// 把所有的 +,-,*,/ 都放在operator栈中while (!operatorStack.isEmpty()&& (operatorStack.peek() == '+' || operatorStack.peek() == '-'|| operatorStack.peek() == '*' || operatorStack.peek() == '/')) {processAnOperator(operandStack, operatorStack);}// 把 + 或者 - 放进operator stack中operatorStack.push(token.charAt(0));} else if (token.charAt(0) == '*' || token.charAt(0) == '/') {while (!operatorStack.isEmpty()&& (operatorStack.peek() == '*' || operatorStack.peek() == '/')) {processAnOperator(operandStack, operatorStack);}operatorStack.push(token.charAt(0));} else if (token.trim().charAt(0) == '(') {operatorStack.push('(');} else if (token.trim().charAt(0) == ')') {while (operatorStack.peek() != '(') {processAnOperator(operandStack, operatorStack);}operatorStack.pop();} else {operandStack.push(new Integer(token));}}while (!operatorStack.isEmpty()) {processAnOperator(operandStack, operatorStack);}// 返回结果return operandStack.pop();}public static void processAnOperator(GenericStack<Integer> operandStack,GenericStack<Character> operatorStack) {char op = operatorStack.pop();int op1 = operandStack.pop();int op2 = operandStack.pop();if (op == '+')operandStack.push(op2 + op1);else if (op == '-')operandStack.push(op2 - op1);else if (op == '*')operandStack.push(op2 * op1);else if (op == '/'){operandStack.push(0);}}/*** 产生数的排列* @param v* @param left* @param right*/public static void perm(int[] v, int left, int right) {if (left == right) {int[] temp = new int[v.length];for (int i = 0; i < v.length; i++) {temp[i] = v[i];}resultList.add(temp);} else {for (int i = left; i <= right; i++) {swap(v, left, i);perm(v, left + 1, right);swap(v, left, i);}}}/*** 产生操作符的排列* @param v* @param left* @param right*/public static void perm(String[] v, int left, int right) {if (left == right) {String[] temp = new String[v.length];for (int i = 0; i < v.length; i++) {temp[i] = v[i];}operatorList.add(temp);} else {for (int i = left; i <= right; i++) {swap(v, left, i);perm(v, left + 1, right);swap(v, left, i);}}}private static void swap(int[] v, int left, int i) {int temp = v[left];v[left] = v[i];v[i] = temp;}private static void swap(String[] v, int left, int i) {String temp = v[left];v[left] = v[i];v[i] = temp;}public static void main(String[] args){int a = (int)(Math.random()*9+1);int b = (int)(Math.random()*9+1);int c = (int)(Math.random()*9+1);int d = (int)(Math.random()*9+1);int[] nums = {a,b,c,d};
//                int[] nums = {7,3,9,7};
//                int[] nums = {3,4,8,3};System.out.println("生成的四个数字为:"+a+" "+b+" "+c+" "+d);System.out.println("所有的表达式为:");findAllSolution(nums);}
}

测试数据如下:

采用的是随机生成的四个数字,并求出能否得到24点。

【24点】java减治法实现二十四点,输出所有求值结果为24的组合相关推荐

  1. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  2. 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全

    从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...

  3. 【零基础学Java】—重写(二十)

    [零基础学Java]-重写(二十) 一.重写和重载 重写(Override):在继承关系当中,方法的名称一样,参数列表一样.重写又称为方法的覆盖.覆写. 重载(Overload):方法的名称一样,参数 ...

  4. JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤...

    JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...

  5. JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤

    JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...

  6. CCF201903-2 二十四点(100分)【表达式计算】

    问题链接:CCF201903-2 二十四点 问题分析: 表达式计算问题,关键是对输入流进行处理,需要考虑表达式中运算符的优先级.简单的逻辑,用穷举法就可以了. 用Python语言来实现的话,问题就简单 ...

  7. 『牛角书』基于JS实现的鸿蒙游戏——二十四点纸牌

    目录 前言 概述 正式开始 一.创建项目 二.编码 1.项目结构 2.实现思路 3.主要代码块 三.页面及功能展示 1.运算正确 2.运算错误 3.换一批及重置 本人项目仓库链接 前言 相信大家都有玩 ...

  8. C语言 解决CCF 二十四点问题

    利用 C 语言 解决 CCF题库中的二十四点问题 特别致谢:原博主程序 编译环境: IDE:DEV-C++ 语言:C语言 CCF CSP官方往年题库链接点我进入 1. 题目如下: 解题思路: 此题难点 ...

  9. csp试题2:二十四点

    csp试题2:二十四点 题目 分析 代码 总结 题目 问题描述       二十四点是一款著名的纸牌游戏,其游戏的目标是使用3个加减乘除运算使得4张纸牌上数字的运算结果为24.       定义每一个 ...

  10. 经典二十四点程序游戏

    经典二十四点程序算法 来源:http://www.xici.net/d190569991.htm 一.概述 算24点:任意给定四个整数,用加.减.乘.除以及适当的括号连接,无论顺序,使计算结果为24, ...

最新文章

  1. 编写Makefile中遇到的各种奇葩问题汇总
  2. 人人都能学会的python编程教程15:高级特性2
  3. Gdiplus中实现双Buffer绘图
  4. python列表的切片操作
  5. c:forEach循环的List为String时的写法
  6. 2020年最好用的手机是哪一款_2020年好评最多的三款手机,看看你在用哪款?
  7. AOM联盟:AV1完成1.0版定稿
  8. Scala _02基础
  9. python技术简介_Python多线程技术简介,简单,阐述,python
  10. 僵尸矩阵 · Zombie in Matrix
  11. 为什么从事软件开发测试?
  12. python_argparse简介
  13. 肉体之爱的解释圣经_可解释的AI的解释
  14. Mac OS 下创建txt文本文件
  15. Unity 防止数组索引越界的几种方法
  16. Python操作Word(Win32com)
  17. 有没有免费的数据恢复软件,easyrecovery中文版
  18. 技术分享 | 基于 Alertmanager 告警系统的改造
  19. 近期关于 WWDC22 上各大新系统的一些传闻
  20. 前端husky中commitlint配置

热门文章

  1. linux常用net命令
  2. 划分vlan实验心得体会_vlan划分实验报告.doc
  3. iSCSI服务部署网络存储
  4. python回归模型调优要运行多久_python机器学习模型参数调优
  5. 【五步完美整理Windows系统】
  6. STM32F0xx系列 基于LL库的Flash模拟EEPROM
  7. 计算机修复开机按什么,电脑蓝屏修复按哪个健?
  8. java 解析 ts_解析TS - xxdd的个人空间 - OSCHINA - 中文开源技术交流社区
  9. vmware 安装 mac os 修改序列号
  10. 如何让win7像win10一样漂亮-win7美化