最近小马的老师要求家长陪同小朋友一起算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