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: Wrong Answer)

import java.util.Scanner;

public class Main {
	public static String f(int a, int b, int c, int d, int k) {
		String str;

		if ((str = check(a, b, c, d, k)) != null) {
			return str;
		}
		if ((str = check(b, c, d, a, k)) != null) {
			return str;
		}
		if ((str = check(c, d, a, b, k)) != null) {
			return str;
		}
		if ((str = check(d, a, b, c, k)) != null) {
			return str;
		}

		if ((str = g(a, b, c, d, k)) != null) {
			return str;
		}
		if ((str = g(a, c, b, d, k)) != null) {
			return str;
		}
		if ((str = g(a, d, b, c, k)) != null) {
			return str;
		}

		return "0";
	}

	public static String f(int a, int b, int c, int k) {
		String str;

		if ((str = check(a, b, c, k)) != null) {
			return str;
		}
		if ((str = check(b, c, a, k)) != null) {
			return str;
		}
		if ((str = check(c, a, b, k)) != null) {
			return str;
		}
		return null;
	}

	public static String g(int a, int b, int c, int d, int k) {
		String str1, str2;

		for (int i = -100; i <= 100; i++) {
			if ((str1 = check(a, b, i)) != null && (str2 = check(c, d, 10 - i)) != null) {
				return "(" + str1 + " + " + str2 + ")";
			}
			if ((str1 = check(a, b, i)) != null && (str2 = check(c, d, i - 10)) != null) {
				return "(" + str1 + " - " + str2 + ")";
			}
			if ((str1 = check(a, b, i)) != null && (str2 = check(c, d, 10 + i)) != null) {
				return "(" + str2 + " - " + str1 + ")";
			}
			if (i != 0 && 10 % i == 0 && (str1 = check(a, b, i)) != null && (str2 = check(c, d, 10 / i)) != null) {
				return "(" + str1 + " * " + str2 + ")";
			}
			if ((i / 10) != 0 && i % 10 == 0 && (str1 = check(a, b, i)) != null && (str2 = check(c, d, i / 10)) != null) {
				return "(" + str1 + " / " + str2 + ")";
			}
			if (i != 0 && (str1 = check(a, b, i)) != null && (str2 = check(c, d, 10 * i)) != null) {
				return "(" + str2 + " / " + str1 + ")";
			}
		}

		return null;
	}

	public static String check(int a, int b, int c, int d, int k) {
		String str;

		if ((str = f(a, b, c, k - d)) != null) {
			return "(" + str + " + " + Integer.toString(d) + ")";
		}
		if ((str = f(a, b, c, k + d)) != null) {
			return "(" + str + " - " + Integer.toString(d) + ")";
		}
		if ((str = f(a, b, c, d - k))!= null) {
			return "(" + Integer.toString(d) + " - " + str + ")";
		}
		if (k % d == 0 && (str = f(a, b, c, k / d)) != null) {
			return "(" + str + " * " + Integer.toString(d) + ")";
		}
		if ((str = f(a, b, c, k * d)) != null) {
			return "(" + str + " / " + Integer.toString(d) + ")";
		}
		if (d % k == 0 && (str = f(a, b, c, d / k)) != null) {
			return "(" + Integer.toString(d) + " / " + str + ")";
		}
		return null;
	}

	public static String check(int a, int b, int c, int k) {
		String str;

		if ((str = check(a, b, k - c)) != null) {
			return  "(" + str + " + " + Integer.toString(c) + ")";
		}
		if ((str = check(a, b, k + c)) != null) {
			return "(" + str + " - " + Integer.toString(c) + ")";
		}
		if ((str = check(a, b, c - k)) != null) {
			return "(" + Integer.toString(c) + " - " + str + ")";
		}
		if (k % c == 0 && (str = check(a, b, k / c)) != null) {
			return "(" + str + " * " + Integer.toString(c) + ")";
		}
		if ((str = check(a, b, k * c)) != null) {
			return "(" + str + " / " + Integer.toString(c) + ")";
		}
		if (c % k == 0 && (str = check(a, b, c / k)) != null) {
			return"(" + Integer.toString(c) + " / " + str + ")";
		}

		return null;
	}

	public static String check(int a, int b, int k) {
		if (a + b == k) {
			return "(" + Integer.toString(a) + " + " + Integer.toString(b) + ")";
		}
		if (a - b == k) {
			return "(" + Integer.toString(a) + " - " + Integer.toString(b) + ")";
		}
		if (b - a == k) {
			return "(" + Integer.toString(b) + " - " + Integer.toString(a) + ")";
		}
		if (a * b == k) {
			return "(" + Integer.toString(a) + " * " + Integer.toString(b) + ")";
		}
		if (a == k * b) {
			return "(" + Integer.toString(a) + " / " + Integer.toString(b) + ")";
		}
		if (b == k * a) {
			return "(" + Integer.toString(b) + " / " + Integer.toString(a) + ")";
		}

		return null;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a, b, c, d;

		while (true) {
			a = sc.nextInt();
			b = sc.nextInt();
			c = sc.nextInt();
			d = sc.nextInt();
			if((a | b | c | d) == 0) {
				break;
			}
			System.out.println(f(a, b, c, d, 10));
		}
	}
}