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.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(10%(input[i]*input[j]) == 0){
						tmpResult = makeExpression(tmpIntArray, 10 / input[i]*input[j]);
						if(tmpResult != null){
							result = ""+tmpResult + " * ("+ input[i] + " * " + input[j]+")";
							break;
						}
					}
				}
				if(result != null){
					break;
				}
			}

			//2??????????¶???????????????????????????§??????
			for(int i = 0; i < 4; i++){
				for(int j = 0; j < 4; j++){
					if(i == j){
						continue;
					}
					int[] tmpIntArray = makeNewArray(input, i, j);
					//??????
					String tmpResult = makeExpression(tmpIntArray, 10 - (input[i]+input[j]));
					//System.out.println("i = "+i+"j = "+j + tmpResult +" "+tmpIntArray[0]+" "+tmpIntArray[1]);
					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(10 % (input[i] + input[j]) == 0){
						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;
			}
		}
//
//		if(array.length == 2){
//			System.out.printf("a[0] %d a[1] %d make %d\n", array[0], array[1], num);
//		}

		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){
				if(result.length() == 1){
					result = array[i]+" - "+result;
				}
				else {
					result = array[i]+" - "+result+"";
				}
				result = "("+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){
					if(result.length() == 1){
						result = result + " * " + array[i];
					}
					else{
						result = result + " * " + array[i];
					}
					result = "("+result+")";
					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;
	}

}