zoukankan      html  css  js  c++  java
  • JAVA实现24点

        最近小马的老师要求家长陪同小朋友一起算24点,对于培养小学生的数学运算能力以及亲子关系,都是一个很不错的方法。
        在活动中一定要注意由易到难,不要一下子搞的特别复杂和困难,打击小朋友的积极性。
        为了引导小马的积极性,我还申请了个微信公众号,在后台部署了24点的计算程序,其中24点的代码如下:
    
    
    /**
     * Witontek.com.
     * Copyright (c) 2012-2016 All Rights Reserved.
     */
    package com.sutong.wechat.demo;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import net.sourceforge.jeval.EvaluationException;
    import net.sourceforge.jeval.Evaluator;
    
    /**
     * 
     * @author xiaolong.ma
     * @version $Id: Card24.java, v 0.1 2016年8月19日 下午3:33:37 xiaolong.ma Exp $
     */
    public class Card24 {
    
        /**
         * 
         * @param args
         * @throws EvaluationException 
         */
        public static void main(String[] args) throws EvaluationException {
            Card24 c = new Card24();
            c.cards = "4,5,6,7";
            System.out.println(c.calc());
    
        }
    
        /**
         * Getter method for property <tt>cards</tt>.
         * 
         * @return property value of cards
         */
        public String getCards() {
            return cards;
        }
    
        /**
         * Setter method for property <tt>cards</tt>.
         * 
         * @param cards value to be assigned to property cards
         */
        public void setCards(String cards) {
            this.cards = cards;
        }
    
        private String         cards;
    
        private List<String>   tempList = new ArrayList<String>();
    
        private List<String[]> opList   = new ArrayList<String[]>();
        private List<String[]> cardList = new ArrayList<String[]>();
    
        public String calc() throws EvaluationException {
            //        a1,a2,a3,a4
            //
            //        先排列全
            //        然后,o1,o2,o3 进行排列
            //        最后,括号
            //        (a1,a2)(a3,a4)
            //        a1,a2,a3,a4
            //        (a1,a2)a3,a4
            //        (a1,a2,a3)a4
    
            String[] arrs = cards.split("\D");
            if (arrs.length != 4) {
                return "必须为4位";
            }
    
            //1.全排列
            permCard(arrs, 0, 3);
    
            String[] ops = { "+", "-", "*", "/" };
            permOp(ops, 0, 3);
    
            Evaluator eval = new Evaluator();
            for (int i = 0; i < cardList.size(); i++) {
    
                String[] ta = cardList.get(i);
                for (int j = 0; j < opList.size(); j++) {
                    String[] to = opList.get(j);
                    List<String> list = create(ta, to);
                    for (String s : list) {
                        // Object result = fel.eval(s);
    
                        String s24 = eval.evaluate(s);
                        float l24 = Float.parseFloat(s24);
                        if (l24 == 24) {
                            return s;
                        }
                    }
    
                }
    
            }
            return "没有算出来。。";
    
        }
    
        //全排列
        public void permCard(String[] buf, int start, int end) {
            if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
                for (int i = 0; i <= end; i++) {
                    //System.out.print(buf[i]);
                    tempList.add(buf[i]);
                }
                // System.out.println();
                String[] newBuf = new String[4];
                for (int i = 0; i < tempList.size(); i++) {
                    newBuf[i] = tempList.get(i);
                }
                cardList.add(newBuf);
                tempList.clear();
    
            } else {// 多个字母全排列
                for (int i = start; i <= end; i++) {
                    String temp = buf[start];// 交换数组第一个元素与后续的元素
                    buf[start] = buf[i];
                    buf[i] = temp;
    
                    permCard(buf, start + 1, end);// 后续元素递归全排列
    
                    temp = buf[start];// 将交换后的数组还原
                    buf[start] = buf[i];
                    buf[i] = temp;
                }
            }
    
        }
    
        //取操作符
        public void permOp(String[] buf, int start, int end) {
            String[] opArr = { "+", "-", "*", "/" };
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    for (int k = 0; k < 4; k++) {
                        String[] newBuf = new String[3];
                        newBuf[0] = opArr[i];
                        newBuf[1] = opArr[j];
                        newBuf[2] = opArr[k];
                        opList.add(newBuf);
                    }
                }
            }
    
        }
    
        //增加括号
        private List<String> create(String[] ta, String[] to) {
    
            //        a1,a2,a3,a4
            //        (a1,a2)a3,a4
            //        (a1,a2,a3)a4
            //      (a1,a2)(a3,a4)
    
            List<String> list = new ArrayList<String>();
    
            list.add(ta[0] + to[0] + ta[1] + to[1] + ta[2] + to[2] + ta[3]);
            list.add("(" + ta[0] + to[0] + ta[1] + ")" + to[1] + ta[2] + to[2] + ta[3]);
            list.add("(" + ta[0] + to[0] + ta[1] + to[1] + ta[2] + ")" + to[2] + ta[3]);
            list.add("(" + ta[0] + to[0] + ta[1] + ")" + to[1] + "(" + ta[2] + to[2] + ta[3] + ")");
            return list;
    
        }
    
    }
    
    
    
     
    其中进行表达式计算使用了jeval
    maven如下:
    
    
    <dependency>
        <groupId>net.sourceforge.jeval</groupId>
        <artifactId>jeval</artifactId>
        <version>0.9.4</version>
    </dependency>
    
    
    

    运算结果:
    (5-6+7)*4

  • 相关阅读:
    数据库事务的四大特性
    Mysql数据库的慢sql优化步骤
    数据库事务的4大隔离级别
    mysql的命令练习
    通过jedis对redis客户端的一些基本操作
    通过jedisPool写一个redis连接池
    jedis
    maven将本地jar包添加到本地仓库
    [Django学习] Django基础(7)_分类统计
    [Django学习] Django基础(6)_Field lookups
  • 原文地址:https://www.cnblogs.com/malaya/p/5807263.html
Copyright © 2011-2022 走看看