问题描述
输入一行数字,以一个空格隔开,每行4个数字,判断用这4个数字进行加减乘除运算,最终能否得到24,如果能,则输出YES 并输出计算公式,如果不能得到24,则输出NO。
读题
例:
输入:
1 5 5 5
输出:
(5-(1/5))*5
YES
代码
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String input = null;
while ((input = in.readLine()) != null && !"".equals(input)) {
String[] factors = input.split(" ");
double[] array = new double[4];
for (int i = 0; i < 4; i++) {
array[i] = Double.parseDouble(factors[i]);
}
if (dfs(array, 4, "")) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
private static boolean dfs(double[] num, int s, String str) {
if (s == 1) {
if (Math.abs(num[0] - 24) == 0) {
print(str);
return true;
} else {
return false;
}
}
double a;
double b;
for (int i = 0; i < s; i++) {
for (int j = i + 1; j < s; j++) {
a = num[i];
b = num[j];
num[j] = num[s - 1];
num[i] = a + b;
if (dfs(num, s - 1, str + "," + a + "+" + b)) {
return true;
}
num[i] = a - b;
if (dfs(num, s - 1, str + "," + a + "-" + b)) {
return true;
}
num[i] = b - a;
if (dfs(num, s - 1, str + "," + b + "-" + a)) {
return true;
}
num[i] = a * b;
if (dfs(num, s - 1, str + "," + a + "*" + b)) {
return true;
}
if (b != 0) {
num[i] = a / b;
}
if (dfs(num, s - 1, str + "," + a + "/" + b)) {
return true;
}
if (a != 0) {
num[i] = b / a;
}
if (dfs(num, s - 1, str + "," + b + "/" + a)) {
return true;
}
num[i] = a;
num[j] = b;
}
}
return false;
}
/************************** 以上为判断是否成立部分***************************
* 这是一条华丽的分割线 *
************************** 以下为打印公式部分*******************************/
private static void print(String str) {
String[] strArr = str.split(",");
double a = cal(strArr[1]);
double b = cal(strArr[2]);
if (strArr[2].contains(String.valueOf(a))) {
strArr[2] = strArr[2].replace(String.valueOf(a), "(" + strArr[1] + ")");
}
if (strArr[3].contains(String.valueOf(b))) {
strArr[3] = strArr[3].replace(String.valueOf(b), "(" + strArr[2] + ")");
}
if (strArr[3].contains(String.valueOf(a))) {
strArr[3] = strArr[3].replace(String.valueOf(a), "(" + strArr[1] + ")");
}
System.out.println(strArr[3].replace(".0",""));
}
private static double cal(String s) {
if (s.contains("+")) {
String[] split = s.split("\\+");
return Double.valueOf(split[0]) + Double.valueOf(split[1]);
}
if (s.contains("-")) {
String[] split = s.split("-");
return Double.valueOf(split[0]) - Double.valueOf(split[1]);
}
if (s.contains("*")) {
String[] split = s.split("\\*");
return Double.valueOf(split[0]) * Double.valueOf(split[1]);
}
if (s.contains("/")) {
String[] split = s.split("/");
return Double.valueOf(split[0]) / Double.valueOf(split[1]);
}
return 0;
}