Problem:
式

与えられた 4 つの 1 から 9 の整数を使って、答えが 10 になる式をつくります。
4 つの整数 a, b, c, d を入力したとき、下記の条件に従い、答えが 10 になる式を出力するプログラムを作成してください。また、答えが複数ある時は、最初に見つかった答えだけを出力するものとします。答えがない時は、0 と出力してください。

演算子として、加算 (+)、減算 (-)、乗算 (*) だけを使います。除算 (/) は使いません。使用できる演算子は３個です。

数を4つとも使わなければいけません。

4つの数の順番は自由に入れ換えてかまいません。

カッコを使ってもかまいません。使用できるカッコは３組（６個）以下です。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおり：

a b c d

入力は４つの 0 で終了します。データセットの数は 40 を超えません。

Output

各データセットについて、与えられた 4 つの整数と上記の演算記号およびカッコを組み合わせて値が 10 となる式または 0 を１行に出力してください。式の文字列が 1024 文字を超えてはいけません。

Sample Input

8 7 9 9
4 4 4 4
5 5 7 5
0 0 0 0

Output for the Sample Input

((9 * (9 - 7)) - 8)
0
((7 * 5) - (5 * 5))

Solution in JAVA (judge verdict: Accepted)

import java.util.Scanner;

public class Main {
	
	public static int exec(int a, int b, int ops){
		return ops == 0 ? a + b : ops == 1 ? a - b : a * b; 
	}
	
	public static String print(String l, String r, int ops){
		return "(" + l + (ops == 0 ? " + " : ops == 1 ? " - " : " * ") + r +  ")";
	}
	
	public static String print(int a, int b, int ops){
		return "(" + a + (ops == 0 ? " + " : ops == 1 ? " - " : " * ") + b +  ")";
	}
	
	public static String print(String l, int b, int ops){
		return "(" + l + (ops == 0 ? " + " : ops == 1 ? " - " : " * ") + b +  ")";
	}
	
	public static String print(int a, String l, int ops){
		return "(" + a + (ops == 0 ? " + " : ops == 1 ? " - " : " * ") + l +  ")";
	}
	
	public static boolean check2(int a, int b, int c, int d, int ops1, int ops2, int ops3){
		if((exec(exec(exec(a,b,ops1),c,ops2),d,ops3)) == 10){
			System.out.println((print(print(print(a,b,ops1),c,ops2),d,ops3)));
			return true;
		}else if(exec(exec(a,exec(b,c,ops2),ops1),d,ops3) == 10){
			System.out.println(print(print(a,print(b,c,ops2),ops1),d,ops3));
			return true;
		}else if((exec(exec(a,b,ops1),exec(c,d,ops3),ops2)) == 10){
			System.out.println(print(print(a,b,ops1),print(c,d,ops3),ops2));
			return true;
		}else if((exec(exec(a,exec(b,c,ops2),ops1),d,ops3)) == 10){
			System.out.println(print(print(a,print(b,c,ops2),ops1),d,ops3));
			return true;
		}else if((exec(a,exec(b,exec(c,d,ops3),ops2),ops1)) == 10){
			System.out.println(print(a,print(b,print(c,d,ops3),ops2),ops1));
			return true;
		}
		return false;
	}
	
	public static boolean check(int a, int b, int c, int d){
		for(int i = 0; i < 3; i++){
			for(int j = 0; j < 3; j++){
				for(int k = 0; k < 3; k++){
					if(check2(a,b,c,d,i,j,k)){
						return true;
					}
				}
			}
		}
		
		return false;
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		while (true) {
			final int a = sc.nextInt();
			final int b = sc.nextInt();
			final int c = sc.nextInt();
			final int d = sc.nextInt();

			if (a == 0 && b == 0 && c == 0 && d ==0) {
				break;
			}
			
			int[] array = {a, b, c, d};
			
			boolean found = false;
			end:
			for(int i = 0; i < 4; i++){
				for(int j = 0; j < 4; j++){
					for(int k = 0; k < 4; k++){
						for(int l = 0; l < 4; l++){
							if(i == j || j == k || k == l || l == i || i == k || j == l){
								continue;
							}
							
							if(check(array[i], array[j], array[k], array[l])){
								found = true;
								break end;
							}
						}
					}
				}
			}
			
			if(!found){
				System.out.println("0");
			}
		}

	}

}