展开全部
挺好玩的一个东西,写着玩儿了.
用递归实现了一个, 可以e69da5e887aa3231313335323631343130323136353331333332623963自定义 5 5 5 5 ,也可以额 5 5 6 6 , 也可以 5 5 5 6 6 6
下面是代码import java.util.ArrayList;
import java.util.List;
public class TestComputeUtil {
public static void main(String[] args) {
List rightExpressions = getRightExpressions(7, 6,5,5,7);
System.out.println(rightExpressions);
}
/**
* 工具方法,得到符合期望值的四则运算表达式,如果结果集size为0,则说明没有结果
*
*
工具方法,得到正确的四则表达式
* @param result 期望得到的结果
* @param parameter 所有的待计算的数字 例如:6,5,5,7
* @return List 复合要求的结果,如果size为0 ,则说明没有符合结果的内容
* @throws
*/
public static List getRightExpressions(int result , int...parameter){
List resultExpressions = new ArrayList();
if(parameter == null){
return resultExpressions;
}
computeResult(resultExpressions,new StringBuilder().append(parameter[0]), result , parameter[0] , 1, parameter);
return resultExpressions;
}
/**
* 根据指针(index)的位置,来进行四则运算.
*
*
根据指针(index)的位置,来进行四则运算.
* @param resultExpressions 最终的结果集合,这里省事儿了,直接传进去了,当然,这种方法并不好,但省事儿,你懂得,哈哈
* @param expression 指针(index)前面所有的四则运算表达式
* @param result 期望的计算结果
* @param stepResult 指针(index)前面所有的四则运算表达式的结果
* @param index 指针位置
* @param parameter 参数数组
* @throws
*/
private static void computeResult(List resultExpressions,StringBuilder expression , int result ,Integer stepResult,int index , int[] parameter){
if(parameter.length >= index+1){
computeResult(resultExpressions, expression, result, stepResult, index, parameter, CalculationSymbols.ADD);
computeResult(resultExpressions, expression, result, stepResult, index, parameter, CalculationSymbols.SUB);
computeResult(resultExpressions, expression, result, stepResult, index, parameter, CalculationSymbols.MULT);
computeResult(resultExpressions, expression, result, stepResult, index, parameter, CalculationSymbols.DIV);
}else {
if(result == stepResult){
resultExpressions.add(expression.toString());
}
}
}
/**
* 一个计算流程包括递归调用computeResult(List resultExpressions,StringBuilder expression , int result ,Integer stepResult,int index , int[] parameter)这个方法
*
*
一个计算流程 , 在这里加减乘除都是一个完整的计算流程.如果以后还想增加别的运算符号的话,只需要修改一下计算方法,以及枚举类.便于扩充
* @param resultExpressions
* @param expression
* @param result
* @param stepResult
* @param index
* @param parameter
* @param sign void
* @throws
*/
private static void computeResult(List resultExpressions,StringBuilder expression , int result ,Integer stepResult,int index , int[] parameter , CalculationSymbols sign){
StringBuilder newExpression = new StringBuilder(expression);
int newResult = computeResult(stepResult, parameter[index], sign, newExpression);
computeResult(resultExpressions, newExpression, result, newResult, index+1, parameter);
}
/**
* 计算
*
*
计算
* @param left
* @param right
* @param sign
* @return int
* @throws
*/
private static int computeResult(int left , int right , CalculationSymbols sign, StringBuilder expression){
switch (sign) {
case ADD:
expression.append("+").append(right);
return left + right;
case SUB:
expression.append("-").append(right);
return left - right;
case MULT:
expression.append("*").append(right);
return left * right;
case DIV:
expression.append("/").append(right);
return left / right;
default:
throw new UnsupportedOperationException("不支持的操作类型!");
}
}
}
/**
* 计算符号枚举
*
*
计算符号枚举
* @author an
* @version V1.0
*/
enum CalculationSymbols{
ADD,SUB,MULT,DIV
}
额,刚看到了一个问题,是这样的,不能用Integer , 需要把所有的Integer给替换成为Double,因为,1/2 = 0 ,你懂的..只需要修改参数类型,以及计算的地方,即可
手打~~