import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collection;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

/**

* 用给定的4个整32313133353236313431303231363533e78988e69d8331333330363830数通过加减乘除运算得到24点,如果有多种情况,则全部输出,如果不能得到24点,输出提示

*

* @思路:将指定的4个数字进行全排列,将运算符‘+’、‘-’、‘*’、‘/’取3个进行所有情况排列,

* 然后将所有的数字排列与所有的运算符排列按顺序计算,

* 如果最后计算结果等于想要的结果值比如24,则为符合条件的运算,

* 将所有符合条件的数字排列和运算符排列存储起来,并在最后打印输出所有可能的情况

*

* @author chenjie

*

*/

public class TwentyFourPoint {

public static void main(String[] args) {

try {

Set set = caculate(new int[] { 18, 18, 6, 12 }, 24);

printlnResultSet(set);

} catch (Exception e) {

// e.printStackTrace();开发期间方便查找错误,测试通过后就无需打印错误信息了

System.err.println(e.getMessage());

}

}

/**

* 打印结果集

*

* @param resultSet

* 结果集

*/

private static void printlnResultSet(Collection resultSet) {

for (String str : resultSet) {

System.out.println(str);

}

}

/**

* 得到给定整形数组的全排列情况

*

* @param numbers

* 给定的整形数组

* @return 全排列数组

*/

private static int[][] arrangeAllNumbers(int[] numbers) {

List list = new ArrayList();

allSort(numbers, 0, numbers.length - 1, list);

int[][] resultSet = new int[list.size()][list.get(0).length];

resultSet = list.toArray(resultSet);

return resultSet;

}

/**

* 得到给定的操作中出现的所有操作符排列情况

*

* @param operators

* 出现的操作符数组

* @param number

* 每组操作符的数量

* @return 所有操作符排列数组

*/

private static char[][] arrangeAllOperators(char[] operators, int number) {

int setSize = (int) Math.pow(operators.length, number);

int index = 0;

char[][] resultSet = new char[setSize][number];

for (int i = 0; i

for (int j = 0; j

for (int k = 0; k

resultSet[index][0] = operators[i];

resultSet[index][1] = operators[j];

resultSet[index][2] = operators[k];

index++;

}

}

}

return resultSet;

}

/**

* 根据给定的一组整数,通过加减乘除运算,得到想要的结果,如果可以得到结果,则返回所有可能的结果的运算形式。

* 返回的运算形式,均按从左到右的顺序计算,并不是遵循四则运算法则,比如:

* 输出的结果形式为:

* 1 * 8 - 6 * 12 = 24

* 表示的运算顺序是:

* 1:1 * 8 = 8,

* 2:8 - 6 = 2,

* 3:2 * 12 = 24

* 而不是按照四则运算法则计算:

* 1:1 * 8 = 8,

* 2:6 * 12 = 72,

* 3:8 * 72 = 576

*

*

* @param numbers

* 给定进行运算的一组整数,4个数为一组

* @param targetNumber

* 想要得到的结果

* @return 所有可能得到想要的结果的所有运算形式的字符串形式集合

* @throws Exception

* 如果不能得到想要的结果,则抛出该异常,表明根据指定的一组数字通过一系列的加减乘除不能得到想要的结果

*/

public static Set caculate(int[] numbers, int targetNumber)

throws Exception {

Set resultSet = new HashSet();// 这里用Set而不是用List,主要是因为当给定的一组数字中如果有重复数字的话,同一结果会被出现多次,如果用List存放的话,会将重复的结果都存放起来,而Set会自动消除重复值

char[][] operatorsArrangement = arrangeAllOperators(new char[] { '+',

'-', '*', '/' }, 3);

int[][] numbersArrangement = arrangeAllNumbers(numbers);

for (int[] nums : numbersArrangement)

for (char[] operators : operatorsArrangement) {

int result = 0;

try {

result = caculate(nums, operators);

} catch (Exception e) {// 出现非精确计算

continue;

}

if (result == targetNumber)

resultSet.add(buildString(nums, operators, targetNumber));// 如果计算后的结果等于想要的结果,就存放到集合中

}

if (resultSet.isEmpty())

throw new Exception("给定的数字:" + Arrays.toString(numbers)

+ "不能通过加减乘除运算得到结果:" + targetNumber);

return resultSet;

}

/**

* 将一组整型数字以给定的操作符按顺序拼接为一个完整的表达式字符串

*

* @param nums

* 一组整型数字

* @param operators

* 一组操作符

* @param target

* 目标值

* @return 拼接好的表达式字符串

*/

private static String buildString(int[] nums, char[] operators, int target) {

String str = String.valueOf(nums[0]);

for (int i = 0; i

str = str + ' ' + operators[i] + ' ' + nums[i + 1];

}

str = str + " = " + target;

return str;

}

/**

* 将给定的一组数字以给定的操作符按顺序进行运算,如:int result = caculate(new int[]{3,4,5,8}, new

* char[]{'+','-','*'});

*

* @param nums

* 一组数字

* @param operators

* 一组运算符,数量为数字的个数减1

* @return 最后的计算结果

* @throws Exception

* 当计算结果不精确时,抛出该异常,主要是针对除法运算,例如18 / 8 = 2,诸如这样不精确计算将抛出该异常

*/

private static int caculate(int[] nums, char[] operators) throws Exception {

int result = 0;

for (int i = 0; i

if (i == 0) {

result = caculate(nums[i], nums[i + 1], operators[i]);

} else {

result = caculate(result, nums[i + 1], operators[i]);

}

}

return result;

}

/**

* 根据指定操作符将两个给定的数字进行计算

*

* @param num1

* 数字1

* @param num2

* 数字2

* @param operator

* 操作符,只能从“+、-、*、/”4个操作符中取值

* @return 计算结果

* @throws Exception

* 当计算结果不精确时,抛出该异常,主要是针对除法运算,例如18 / 8 = 2,诸如这样不精确计算将抛出该异常

*/

private static int caculate(int num1, int num2, char operator)

throws Exception {

double result = 0;

switch (operator) {// 根据操作符做相应的计算操作

case '+':

result = num1 + num2;

break;

case '-':

result = num1 - num2;

break;

case '*':

result = num1 * num2;

break;

case '/':

result = (double) num1 / (double) num2;

break;

}

if (!check(result))

throw new Exception("不精确的计算数字");

return (int) result;

}

/**

* 检查指定的浮点数是否可以直接转换为整型数字而不损失精度

*

* @param result

* 要检查的浮点数

* @return 如果可以进行无损转换,返回true,否则返回false

*/

private static boolean check(double result) {

String str = String.valueOf(result);

int pointIndex = str.indexOf(".");// 小数点的下标值

String fraction = str.substring(pointIndex + 1);

return fraction.equals("0") ? true : false;// 通过判断小数点后是否只有一个0来确定是否可以无损转换为整型数值

}

/**

* 对传入的整型数组buf进行全排列

*

* @param buf

* 要进行全排列的整型数组

* @param start

* 开始的下标值

* @param end

* 结束下标值

* @param list

* 保存最后全排列结果的集合

*/

private static void allSort(int[] buf, int start, int end, List list) {

if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可

int[] a = new int[buf.length];

System.arraycopy(buf, 0, a, 0, a.length);

list.add(a);

} else {// 多个字母全排列

for (int i = start; i <= end; i++) {

int temp = buf[start];// 交换数组第一个元素与后续的元素

buf[start] = buf[i];

buf[i] = temp;

allSort(buf, start + 1, end, list);// 后续元素递归全排列

temp = buf[start];// 将交换后的数组还原

buf[start] = buf[i];

buf[i] = temp;

}

}

}

}

速算24点java_24点速算游戏 Java 代码相关推荐

  1. 24点游戏java代码 中国开源社区_编程实现一个有GUI的24点游戏

    24点是指从去除大小王后的52张扑克牌中任取 4 张,通过「加.减.乘.除」四则运算得到 24.是一个历史悠久的趣味小游戏. <数据化管理>书中在测试数据敏感度章节提到一个细节" ...

  2. 24点游戏java代码 中国开源社区_编程之美 1.16 24点游戏

    24点游戏大家都知道:4张牌,可以进行+ - * / 四种运算,可以使用括号,每个牌用一次,任意组合构造表达式使结果为24. 扩展问题:n个整数,四种运算,可使用括号,每个数字使用一次,使表达式结果为 ...

  3. HDU1427 速算24点【DFS】

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  4. Python写个小游戏:速算24点(下)

    文章目录 前言 速算24点 1. 玩法简介 2. 游戏流程 3. 剩下的部分 1). 关卡 / 分数信息 IntVar类 2). 提示按钮 图片 按钮 3). 重新发牌 4. 让电脑计算24点 1). ...

  5. 计算机二十四点游戏,比比速算24点游戏

    电脑扑克牌游戏试运行在PC端的智力小游戏,这次带来的是比比速算24点游戏,学习纸牌的同时还能不断提高你的头脑思维能力,让你的智商一天比一天更高.比比速算24点游戏设置了一级高手.二级能手.三级好手.四 ...

  6. 速算C语言程序设计,C语言程序设计课程设计-速算24.doc

    该设计论文已经通过各大高校老师审核认可并通过答辩,准确完整无误.欢迎大家下载学习交流.如有疑问可随时联系店主,竭诚为您解答!! 应用技术学院 课 程 设 计 报 告 课程名称 C语言课程设计 课题名称 ...

  7. 24速算c语言实训报告ppt,C语言课程设计(速算24).doc

    <> 课程设计报告 速算24专业:计算机科学与技术班级:姓名:指导教师:成绩: 计算机与信息工程系 二0一四年二月二十日 目录 1.该系统的功能描述.................... ...

  8. HDU 1427 速算24点(dfs)

    Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/ ...

  9. Python写个小游戏:速算24点(上)

    文章目录 前言 速算24点 1. 玩法简介 2. 游戏流程 3. 搭建游戏界面 1). 基本界面 2). 洗牌.发牌 洗牌 发牌 3). 计时器 4). 玩家输入公式(答案) StringVar类 按 ...

最新文章

  1. 光伏电站或成辅助服务市场“输家”
  2. Paddington2
  3. html坐标定位图解,HTML5地理定位实例
  4. linux 目录定义,linux根目录定义
  5. JavaScript事件基础知识总结【思维导图】
  6. redo mysql mvcc_Mysql事务中的ACID是怎么实现的
  7. 黑马程序员JUC并发教程笔记(一)
  8. android 虚拟wifi定位,基于Android手机的WiFi定位系统设计
  9. 数据结构c语言课程设计报告,数据结构c语言课程设计报告.doc
  10. 江晓华:为火箭发射寻觅气象窗口
  11. Vue 3 中文文档来啦!
  12. dw网页制作教程百度云盘_Dreamweaver网页制作教程
  13. android netd firewall 分析,第2章 深入理解Netd
  14. 从零开始学习ThingJS之创建/销毁物体
  15. 别只看钱:赛门铁克46.5亿美元现金收购Blue Coat为哪般?
  16. Swing学习01:Swing是什么
  17. 编写一个程序,提示用户输入一个四位整数(例如:1234),然后显示输入数的相反排序(例如:4321)并计算该数字中每个数字的总和(总和=4+3+2+1)。
  18. C#执行js中的函数的问题,以sohu邮箱登陆密码js的MD5为例
  19. simulink如何简单的控制模块间执行顺序
  20. Vue面试题你学会了吗

热门文章

  1. 【OpenGL开发】VS2017+nuget配置OpenGL开发环境
  2. Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)C. Unusual Competitions
  3. 实施微前端的六种方式
  4. 意图的分类及其应用场景
  5. Flink scal api 不支持RichAsyncFunction
  6. 来认识一下四大主流接口VGA、DVI、HDMI、DP基础知识详解
  7. 非接环境(PPSE)和接触环境(PSE)的FCI有什么区别
  8. 程序员2天做出的猫咪情绪识别软件,究竟用了什么技术?
  9. 基于Grad-CAM与KL损失的SSD目标检测算法
  10. 疫情下的口罩生活,演绎出了哪些心理剧场?