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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO ?????????????????????????????????????????????
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		while(true){
			String tmp = br.readLine();

			if(tmp == null){
				break;
			}

			int[] input = new int[4];
			String[] tmpArray = tmp.split(" ");
			for(int i = 0; i < 4; i++){
				input[i] = Integer.parseInt(tmpArray[i]);
			}
			
			if(input[0] == 0 && input[1] == 0 && input[2] == 0 && input[3] == 0){
				break;
			}

			String result = makeExpression(input, 10);
			
			//2??????????????????????????????????????§??????
			for(int i = 0; i < 4; i++){
				for(int j = i + 1; j < 4; j++){
					int[] tmpIntArray = makeNewArray(input, i, j);
					//??????
					String tmpResult = makeExpression(tmpIntArray, 10 - input[i]*input[j]);
					if(tmpResult != null){
						result = input[i] + " * " + input[j] + " + " + tmpResult;
						break;
					}
					//??????1
					tmpResult = makeExpression(tmpIntArray, input[i]*input[j] - 10);
					if(tmpResult != null){
						result = input[i] + " * " + input[j] + " - " + tmpResult;
						break;
					}
					//??????2
					tmpResult = makeExpression(tmpIntArray, 10 + input[i]*input[j]);
					if(tmpResult != null){
						result = tmpResult + " - "+ input[i] + " * " + input[j];
						break;
					}
				}
				if(result != null){
					break;
				}
			}
			
			if(result != null){
				System.out.println(result);
			}
			else {
				System.out.println(0);
			}
		}
	}

	static String makeExpression(int[] array, int num){
		String result = null;
		if(array.length == 1 ){
			if( array[0] == num){
				return String.valueOf(array[0]);
			}
			else {
				return null;
			}
		}

		for(int i = 0; i < array.length ; i++){
			int[] tmpNewArray = makeNewArray(array, i);
			//?????????????????§
			result = makeExpression(tmpNewArray, num - array[i]);
			if(result != null){
				result = array[i]+" + "+result;
				break;
			}
			//?????????????????§1
			result = makeExpression(tmpNewArray, array[i] - num);
			if(result != null){
				result = array[i]+" - ("+result+")";
				break;
			}
			//?????????????????§2
			result = makeExpression(tmpNewArray, array[i] + num);
			if(result != null){
				result = result + " - " + array[i];
				break;
			}
			//?????????????????§
			if(array[i] != 0 && num%array[i] == 0){
				result = makeExpression(tmpNewArray, num/array[i]);
				if(result != null){
					result = "("+ result + ") * " + array[i];
					break;
				}
			}
			//?????????????????§1
			if(num != 0 && array[i]%num == 0){
				result = makeExpression(tmpNewArray, array[i]/num);
				if(result != null){
					result = array[i]+" / ("+result+")";
					break;
				}
			}
			//?????????????????§2
			if(array[i] != 0){
				result = makeExpression(tmpNewArray, array[i]*num);
				if(result != null){
					result = "("+result + ") /" + array[i];
				}
			}
		}
		
		//??????2?????\????????????????????????????????§???????????????????????????
		//?????¨???????????¢???????????§??????????????????????????????????????????

		return result;
	}

	static int[] makeNewArray(int[] array, int delete){
		int[] newArray = new int[array.length - 1];
		int j = 0;
		for(int i = 0; i < array.length ; i++){
			if(i != delete){
				newArray[j] = array[i];
				j++;
			}
		}

		return newArray;
	}
	
	static int[] makeNewArray(int[] array, int delete1, int delete2){
		int[] newArray = new int[array.length - 2];
		int j = 0;
		for(int i = 0; i < array.length ; i++){
			if(i != delete1 && i != delete2){
				newArray[j] = array[i];
				j++;
			}
		}

		return newArray;
	}

}