描述
给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。
输入描述:
读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。
输出描述:
对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false
示例1
输入:
7 2 1 10输出:
true
import java.util.*;
import java.math.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String s = in.nextLine();
String[] array = s.split(" ");
double[] dArray = new double[array.length];
for (int i=0; i<array.length; i++) {
dArray[i] = (double)(Integer.valueOf(array[i]));
}
deal(dArray, dArray.length);
}
}
public static double op(double v1, double v2, int op) {
double res = 0.0;
if (op == 0) {
res = v1+v2;
}
else if(op == 1) {
res = v1-v2;
}
else if(op == 2) {
res = v1*v2;
}
else if(op == 3) {
if (v2 == 0.0) {
res = 0.0;
}
else {
res = v1/v2;
}
}
try {
BigDecimal big = new BigDecimal(res);
big.setScale(1, RoundingMode.HALF_UP);
return big.doubleValue();
}
catch (Exception e) {
System.out.println(res);
}
return res;
}
public static void deal(double[] array, int size) {
for (int i1=0; i1<size; i1++) {
for (int i2=0; i2<size; i2++) {
for (int i3=0; i3<size; i3++) {
for (int i4=0; i4<size; i4++) {
if (i1!=i2 && i1!=i3 && i1!=i4 && i2!=i3 && i2!=i4 && i3!=i4) {
// fuhao
for (int j1=0; j1<4; j1++) {
for (int j2=0; j2<4; j2++) {
for (int j3=0; j3<4; j3++) {
// ((1,2)3)4
double v1 = op(op(op(array[i1],array[i2], j1),array[i3], j2), array[i4], j3);
if (v1 == 24.0) {
System.out.println(true);
return ;
}
// (1,2)(3,4)
v1 = op(op(array[i1],array[i2], j1),op(array[i3],array[i4], j2), j3);
if (v1 == 24.0) {
System.out.println(true);
return ;
}
// 1(2(3,4)
v1 = op(array[i1], op(array[i2], op(array[i3],array[i4], j1), j2), j3);
if (v1 == 24.0) {
System.out.println(true);
return ;
}
}
}
}
}
}
}
}
}
System.out.println(false);
}
}