python和java各给出一种解法。
python的eval()函数解此题有天然优势。主要需要注意用双斜杠表示除法,保留整数。
a=input();
for i in range(int(a)):
b=input().replace("x", "*").replace("/", "//");
if(eval(b)==24):
print("Yes")
else:
print("No")
java
用ArrayList<String>保存数字和符号。
第一步,找出运算位置:当前list中有乘除符号,则运算位置在第一个乘号/除号处。当前list中没有乘除符号,则运算位置在第一个符号处。
第二步,局部运算:根据第一步找到的“运算符的下标”,算出答案,然后用计算结果替换原来的运算三元组(此时list的size也就减少了2)
接着,重复第一、二步,直到算完,这时list.size()==1。可以用递归也可以用循环。
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
in.nextLine();
while(n-->0){
String s=in.nextLine();
ArrayList<String>list=new ArrayList<>();
for(int i=0;i<7;i++){
list.add(s.substring(i,i+1));
}
if(f(list)==24)
System.out.println("Yes");
else
System.out.println("No");
}
}
public static int f(ArrayList<String>list){//递归计算
if(list.size()==1)//递归出口
return Integer.parseInt(list.get(0));
for(int i=0;i<list.size();i++){
if(list.get(i).equals("x")||list.get(i).equals("/")){
list.set(i,""+f2(list.get(i-1),list.get(i),list.get(i+1)));
list.remove(i+1);
list.remove(i-1);
return f(list);
}
}
list.set(1,""+f2(list.get(0),list.get(1),list.get(2)));
list.remove(2);
list.remove(0);
return f(list);
}
public static int f2(String x1,String x2,String x3){//计算一个短式子
int a=Integer.parseInt(x1);
int b=Integer.parseInt(x3);
if(x2.equals("+"))
return a+b;
else if(x2.equals("-"))
return a-b;
else if(x2.equals("x"))
return a*b;
else return a/b;
}
}
Java的另一种解法
在java里外链js 使用js中的eval(),本地测试没问题。
import java.util.Scanner;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine();
while (n-- > 0) {
if (f(in.nextLine().replaceAll("x", "*")) == 24)
System.out.println("Yes");
else
System.out.println("No");
}
}
private static int f(String c) {//计算算式
//除号处理
char[]b=c.toCharArray();
if(b[1]=='/' && b[5]=='/'&&(b[3]=='*'||b[3]=='/'))
c="Math.floor(Math.floor(Math.floor("+b[0]+"/"+b[2]+")"+b[3]+b[4]+")/"+b[6]+")";
else if(b[1]=='/' && b[5]=='/')
c="Math.floor("+b[0]+"/"+b[2]+")"+b[3]+"Math.floor("+b[4]+"/"+b[6]+")";
else
if(b[1]=='/')
c="Math.floor("+b[0]+"/"+b[2]+")"+c.substring(3);
else if(b[5]=='/')
c=c.substring(0,4)+"Math.floor("+c.substring(4)+")";
//除号处理 end
Object res=eval(c);//注意当有除号时,返回Double。
if(res instanceof Integer)
return ((Integer) res).intValue();
else return((Double)res).intValue();
}
//java调用js的eval
private static Object eval(String s) {
Object result = null;
ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
try {
result = jse.eval(s);
} catch (ScriptException e) {
e.printStackTrace();
}
return result;
}
}