import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.security.auth.kerberos.KerberosKey; public class Main{ int N=8; int [] step=new int[N]; String ope[]={"+","-",""}; ScriptEngineManager manager=new ScriptEngineManager(); ScriptEngine engine=manager.getEngineByName("js"); private void step() { step[N-1]++; for(int i=N-1;i>=0;i--) { if(step[i]>2) { step[i]=step[i]%3; if(i!=0) step[i-1]++; } else { break; } } } public int search() throws ScriptException { int K=(int)Math.pow(3, N); int count=0; for(int i=0;i<K;i++) { String operation="1"+ope[step[0]]+"2"+ope[step[1]]+"3"+ope[step[2]]+ "4"+ope[step[3]]+"5"+ope[step[4]]+"6"+ope[step[5]]+ "7"+ope[step[6]]+"8"+ope[step[7]]+"9"; //Object result=engine.eval(operation); //double d=((Double)result).doubleValue(); String result=sizeyunsuan(operation); double d=Double.parseDouble(result); if((int)d==5) { count++; } step(); } return count; } private static String addBigDecimal(String a,String b) { double a1=Double.parseDouble(a); double b1=Double.parseDouble(b); BigDecimal a2=BigDecimal.valueOf(a1); BigDecimal b2=BigDecimal.valueOf(b1); BigDecimal s=a2.add(b2); return s.toString(); } private static String substractBigDecimal(String a,String b) { double a1=Double.parseDouble(a); double b1=Double.parseDouble(b); BigDecimal a2=BigDecimal.valueOf(a1); BigDecimal b2=BigDecimal.valueOf(b1); BigDecimal s=a2.subtract(b2); return s.toString(); } private static String sizeyunsuan(String s) { //1、先将 +-*/找出来 int p=0;//the count of (+-*/) for(int i=0;i<s.length();i++) { if(s.charAt(i)==‘+‘ || s.charAt(i)==‘-‘) p++; } //将字符串按照运算符进行切割总共有 2*p+1个段 example:p=5 String[] piece=new String[2*p+1];// save pieces divided by operator 11 pieces int start=0,index=0;// for(int i=0;i<s.length();i++) { if(s.charAt(i)==‘+‘ || s.charAt(i)==‘-‘) { piece[index]=s.substring(start,i);//index=0 i=1 p[0]="9" index++; piece[index]=""+s.charAt(i); //index=1 i=1 p[1]="+" index++; start=i+1; //start=2 } } // last piece; piece[index]=s.substring(start,s.length()); /// int count=p; while(count>0) { //then calculate +- for(int i=0;i<piece.length;i++) { if(piece[i].equals("+") || piece[i].equals("-")) { //find strs in piece has not calculated //find strs left not equals "p" int l=0; for(l=i-1;l>-1;l--) { if(!piece[l].equals("p")) break; } //find strs right not equals "p" int r=0; for(r=i+1;r<piece.length;r++) { if(!piece[r].equals("p")) break; } if(piece[i].equals("+")) { piece[i]=addBigDecimal(piece[l], piece[r]); piece[l]="p"; piece[r]="p"; count--; } else { piece[i]=substractBigDecimal(piece[l], piece[r]); piece[l]="p"; piece[r]="p"; count--; } //break; } } } String r=""; //find the string not equals "p" for(int i=0;i<piece.length;i++) { if(!piece[i].equals("p")) { r=piece[i]; break; } } return r; } public static void main(String[] args) throws ScriptException{ Main main=new Main(); long begin=System.currentTimeMillis(); int c=main.search(); long end=System.currentTimeMillis(); System.out.println(c); System.out.println("共花费"+(end-begin)+"ms"); } }
使用ScriptEngineManager
21
共花费637ms
使用自定义算法
21
共花费80ms
时间: 2024-10-13 23:39:54