CCF 201903-2 二十四点
计算表达式时最好是将操作数和操作符分开,四则运算的规则不复杂但是仍需细致考虑清楚(最开始就是没考虑清楚没拿到满分)。以计算三次为限,先算乘除法时向前替换操作数和操作符,后算加减法时向后运算替换(若计算次数已经是零了就直接取第一步的第一个操作数即为结果)。下面上满分代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = Integer.parseInt(scanner.nextLine());
int[] result = new int[num];
for(int i=0 ; i<num ; i++) {
String line = scanner.nextLine();
int[] oper = new int[4];
char[] opan = new char[3];
for(int j=0 ; j<oper.length ; j++) {
oper[j]=line.charAt(2*j)-'0';
}
for(int j=0 ; j<opan.length ; j++) {
opan[j]=line.charAt(2*j+1);
}
int temp = 0;
int count = opan.length;
for(int j=0 ; j<count ; j++) {
if(opan[j]=='x' || opan[j]=='/') {
if(opan[j]=='x') {
temp = oper[j]*oper[j+1];
oper[j] = temp;
}else if(opan[j]=='/'){
temp = oper[j]/oper[j+1];
oper[j] = temp;
}
for(int k=j+1 ; k<count ; k++) {
oper[k]=oper[k+1];
opan[k-1]=opan[k];
}
count--;
j--;
}
}
for(int j=0 ; j<count ; j++) {
if(opan[j]=='+') {
temp = oper[j]+oper[j+1];
oper[j+1] = temp;
}else if(opan[j]=='-') {
temp = oper[j]-oper[j+1];
oper[j+1] = temp;
}
}
if(count==0) {
result[i] = oper[0];
}else {
result[i] = temp;
}
}
scanner.close();
for(int i : result) {
if(i==24)System.out.println("Yes");
else System.out.println("No");
}
}
}