个人感觉这个题最关键的地方是对加减乘除符号的处理,在刚开始做的时候想了很长时间没想到很好的办法,因为乘除的优先级高于加减,如果只是顺序运算则一定不对,最后决定在写出式子之后直接对乘除运算进行处理,首先从左到右依次找到x和/符号,然后找到符号前后的数字,将整体(符号前的数+符号+符号后的数)用其运算结果代替,一直到式子中只剩+和-,然后就从左到右加减运算得到最终结果。
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
for(int i=0;i<n;i++) {
String str = sc.nextLine();
int j = 0;
while(str.indexOf("/")!=-1 || str.indexOf("x")!=-1) { //因为乘除优先级高,所以首先对所有的'x'和'/'进行处理
if(str.indexOf("/")!=-1 && str.indexOf("x")!=-1) //乘除都有
j = Math.min(str.indexOf("/"),str.indexOf("x")); //乘除同级别,从左到右顺序计算,谁在前先算谁
else if(str.indexOf("/")!=-1 && str.indexOf("x")==-1) //只有除没有乘
j = str.indexOf("/");
else if(str.indexOf("/")==-1 && str.indexOf("x")!=-1) //只有乘
j = str.indexOf("x");
if(j!=-1) { //在找到一个乘号或者一个除号的时候
String tmp1 = "";
int k = 1;
while(j-k>=0 && str.charAt(j-k)>='0' && str.charAt(j-k)<='9') { //找到符号前面的数,j-k是为防止检索到-1越界
tmp1 = str.charAt(j-k)+tmp1;
k++;
}
String tmp2 = "";
k = 1;
while(j+k<str.length() && str.charAt(j+k)>='0' && str.charAt(j+k)<='9') { //找到符号后面的数,j+k是为防止检索到str.length()越界
tmp2 += str.charAt(j+k);
k++;
}
//用计算的结果替换原来乘法或者除法的运算
if(str.charAt(j)=='/') {
String restr = (Integer.parseInt(tmp1) / Integer.parseInt(tmp2))+"";
str = str.replaceAll(tmp1+str.charAt(j)+tmp2, restr);
}
else if(str.charAt(j)=='x') {
String restr = (Integer.parseInt(tmp1) * Integer.parseInt(tmp2))+"";
str = str.replaceAll(tmp1+str.charAt(j)+tmp2, restr);
}
}
}
//在上面的操作完成后剩下得只有加减法运算,优先级同级顺序运算即可。
int tmp = 0;
int Sum = 0;
char f = '+'; //因为Sum=0,第一个操作是Sum一定是加第一个数,所以设符号f为'+'
for(j=0;j<str.length();j++) {
if(str.charAt(j)>='0' && str.charAt(j)<='9') {
tmp = tmp*10 + (str.charAt(j)-'0');
}
else { //在找到下一个符号的时候完成上一个符号的加减操作然后用新找到符号替换原符号
if(f == '+')
Sum += tmp;
else
Sum -= tmp;
f = str.charAt(j);
tmp = 0;
}
if(j==str.length()-1) { //Sum +或-最后一个数
if(f == '+')
Sum += tmp;
else
Sum -= tmp;
}
}
//输出结果
if(Sum == 24) {
System.out.println("Yes");
}
else
System.out.println("No");
}
}
}
提交结果得了满分,应该没什么太大的问题,但是整体过程好像还是有点复杂,我没有想到很好的简单方法。如果有不同思路或者对我写的代码有不同看法的欢迎大家提出,共同进步。