【24点】java减治法实现二十四点,输出所有求值结果为24的组合
题目要求:
用户输入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的组合相关推荐
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全
从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...
- 【零基础学Java】—重写(二十)
[零基础学Java]-重写(二十) 一.重写和重载 重写(Override):在继承关系当中,方法的名称一样,参数列表一样.重写又称为方法的覆盖.覆写. 重载(Overload):方法的名称一样,参数 ...
- JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤...
JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...
- JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤
JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...
- CCF201903-2 二十四点(100分)【表达式计算】
问题链接:CCF201903-2 二十四点 问题分析: 表达式计算问题,关键是对输入流进行处理,需要考虑表达式中运算符的优先级.简单的逻辑,用穷举法就可以了. 用Python语言来实现的话,问题就简单 ...
- 『牛角书』基于JS实现的鸿蒙游戏——二十四点纸牌
目录 前言 概述 正式开始 一.创建项目 二.编码 1.项目结构 2.实现思路 3.主要代码块 三.页面及功能展示 1.运算正确 2.运算错误 3.换一批及重置 本人项目仓库链接 前言 相信大家都有玩 ...
- C语言 解决CCF 二十四点问题
利用 C 语言 解决 CCF题库中的二十四点问题 特别致谢:原博主程序 编译环境: IDE:DEV-C++ 语言:C语言 CCF CSP官方往年题库链接点我进入 1. 题目如下: 解题思路: 此题难点 ...
- csp试题2:二十四点
csp试题2:二十四点 题目 分析 代码 总结 题目 问题描述 二十四点是一款著名的纸牌游戏,其游戏的目标是使用3个加减乘除运算使得4张纸牌上数字的运算结果为24. 定义每一个 ...
- 经典二十四点程序游戏
经典二十四点程序算法 来源:http://www.xici.net/d190569991.htm 一.概述 算24点:任意给定四个整数,用加.减.乘.除以及适当的括号连接,无论顺序,使计算结果为24, ...
最新文章
- 编写Makefile中遇到的各种奇葩问题汇总
- 人人都能学会的python编程教程15:高级特性2
- Gdiplus中实现双Buffer绘图
- python列表的切片操作
- c:forEach循环的List为String时的写法
- 2020年最好用的手机是哪一款_2020年好评最多的三款手机,看看你在用哪款?
- AOM联盟:AV1完成1.0版定稿
- Scala _02基础
- python技术简介_Python多线程技术简介,简单,阐述,python
- 僵尸矩阵 · Zombie in Matrix
- 为什么从事软件开发测试?
- python_argparse简介
- 肉体之爱的解释圣经_可解释的AI的解释
- Mac OS 下创建txt文本文件
- Unity 防止数组索引越界的几种方法
- Python操作Word(Win32com)
- 有没有免费的数据恢复软件,easyrecovery中文版
- 技术分享 | 基于 Alertmanager 告警系统的改造
- 近期关于 WWDC22 上各大新系统的一些传闻
- 前端husky中commitlint配置