最近小馬的老師要求家長陪同小朋友一起算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