Q02 数列的四则运算

Q02 数列的四则运算

假设这里的条件是,组合算式的计算结果为“将原数字各个数位上的数逆序排列得到的数”,并且算式的运算按照四则运算的顺序进行(先乘除,后加减)

import javax.script.*;
import java.util.*;
class Solution{
	public static void main(String[] args) throws ScriptException{
		calc();
	}
	public static String calc() throws ScriptException{
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine se = manager.getEngineByName("javascript");
		String[] op = new String[]{"+","-","*","/",""};
		int n = op.length;
		for(int m = 1000;m<=10000;m++){
			String s = String.valueOf(m);
			for(int i = 0;i<n;i++){
				for(int j = 0;j<n;j++){
					for(int k = 0;k<n;k++){
						// 这个地方使用了一个小的技巧,倒序进行计算,那么就可以直接和原字符串比较,而不用反转原字符串
						String res = s.charAt(3) + op[i] + s.charAt(2) + op[j] + s.charAt(1) + op[k] + s.charAt(0);
						// >4 表示一定要插入一个运算符
						if(res.length()>4) if ((int)se.eval(res) == m) return res;
					}
				}
			}
		}
		return "";
	}
	/**
	一旦用了“*”以外的任意运算符,最终的结果就凑不够4位数了。用“+”时,最大的值只有999+9=1008。逆序排列不可能得到原始值。当然,用“-”也不可能。
	*/
	public static String calc2() throws ScriptException{
		ScriptEngineManager manager = new ScriptEngineManager();
		ScriptEngine se = manager.getEngineByName("javascript");
		String[] op = new String[]{"*",""};
		int n = op.length;
		for(int m = 1000;m<=10000;m++){
			String s = String.valueOf(m);
			for(int i = 0;i<n;i++){
				for(int j = 0;j<n;j++){
					for(int k = 0;k<n;k++){
						// 这个地方使用了一个小的技巧,倒序进行计算,那么就可以直接和原字符串比较,而不用反转原字符串
						String res = s.charAt(3) + op[i] + s.charAt(2) + op[j] + s.charAt(1) + op[k] + s.charAt(0);
						// >4 表示一定要插入一个运算符
						if(res.length()>4) if ((int)se.eval(res) == m) return res;
					}
				}
			}
		}
		return "";
	}

}
posted @ 2021-01-06 15:08  BOTAK  阅读(189)  评论(0编辑  收藏  举报