Java实现1到9连续运算的结果值为100


 

  在实现过程中,主要涉及到两个知识点:一是递归算法的运用;二是调用JavaScript引擎实现字符串的数学运算。在编码之前,首先需要定义三个数组

  •   对于最终拼接字符串数组的定义,在1到9之间添加空元素
  •   把对应空元素的下标建立对应的数组
  •   运算符数组

 

public class SumOneHundred {

    public static String[] base = new String[] { "1", "", "2", "", "3", "", "4", "", "5", "", "6", "", "7", "", "8", "",
            "9" };
    public static int[] index = new int[] { 1, 3, 5, 7, 9, 11, 13, 15 };
    public static String[] operationSymbol = new String[] { "+", "-", "*", "/","" };
    public static ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript");
    public static int num = 0;

    public static void main(String[] args) throws ScriptException {
        operation();
    }

    public static void operation() throws ScriptException {

        
        
        for (int j = 0; j < operationSymbol.length; j++) {
            base[index[num]] = operationSymbol[j];
            if(num < index.length-1){
                num++;
                operation();
            }else{
                StringBuffer sb = new StringBuffer();
                for(int i = 0; i < base.length; i++){
                     sb.append(base[i]);
                    }
                Double eval = (Double) se.eval(sb.toString());
                if(eval == 100.0){
                    System.out.println(sb.toString());
                }
            }
        }
        num--; //在循环执行完一个运算符赋值流程后,对下标值进行移位

    }

}

  该问题的本质:在1到9之间通过添加不同的运算符,获取最终运算结果为100的表达式。由排列组合的原理,可以得出总共有65536(4^8)种情况,最终的结果也是从中进行筛选。那么接下来的问题就是如何取得所有的排列组合?对于这种层级场景,首先想到的就是通过递归进行实现:递归函数内部实现运算符的循环赋值,递归函数之间实现层级关系(空元素的下标对应的数组的循环)。
  在递归函数内部,最重要的一步操作是num--,每执行完一次运算符循环赋值,则往上升一级,完成所有的排列组合。通过判断num值的大小确定是否循环到最后一个空元素位,进而对字符串进行数学运算,判断结果是否为100。

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!