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.*;
import java.lang.*;
import java.math.*;
import java.io.*;

import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Main{

	Scanner sc=new Scanner(System.in);

	int INF=1<<28;
	double EPS=1e-9;

	int[] a;
	int n;
	boolean f;

	void run(){
		n=4;
		a=new int[n];
		for(;;){
			int sq=0;
			for(int i=0; i<n; i++){
				a[i]=sc.nextInt();
				sq+=a[i]*a[i];
			}
			if(sq==0){
				break;
			}
			solve();
		}
	}

	void solve(){
		f=false;
		rec(0);
		if(!f){
			println("0");
		}
	}

	void rec(int i){
		if(f){
			return;
		}
		if(i==n){
			// debug(a);
			check();
			return;
		}
		for(int j=i; j<n; j++){
			// swap[i,j];
			int t=a[i];
			a[i]=a[j];
			a[j]=t;
			rec(i+1);
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}
	}

	void check(){
		// (a(b(cd)))
		// (((ab)c)d)
		// ((ab)(cd))
		String[] ops={"+", "-", "*"};
		for(int i=0; i<3; i++){
			for(int j=0; j<3; j++){
				for(int k=0; k<3; k++){
					String format="";
					if(cal(a[0], i, cal(a[1], j, cal(a[2], k, a[3])))==10){
						format="(%d %s (%d %s (%d %s %d)))";
						f=true;
					}else if(cal(cal(cal(a[0], i, a[1]), j, a[2]), k, a[3])==10){
						format="(((%d %s %d) %s %d) %s %d)";
						f=true;
					}else if(cal(cal(a[0], i, a[1]), j, cal(a[2], k, a[3]))==10){
						format="((%d %s %d) %s (%d %s %d))";
						f=true;
					}
					if(f){
						println(String.format(format, a[0], ops[i], a[1],
								ops[j], a[2], ops[k], a[3]));
						return;
					}
				}
			}
		}
	}

	int cal(int a, int op, int b){
		switch(op){
		case 0:
			return a+b;
		case 1:
			return a-b;
		case 2:
			return a*b;
		}
		return 0;
	}

	void debug(Object... os){
		System.err.println(Arrays.deepToString(os));
	}

	void print(String s){
		System.out.print(s);
	}

	void println(String s){
		System.out.println(s);
	}

	public static void main(String[] args){
		// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
		new Main().run();
	}
}