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.*;

public class Main {
	Scanner sc = new Scanner(System.in);
	int keisan(int a,int b,int c,int d){
		char ctr[] = {'+','-','*'};
		for(int i = 0;i < 3;i++){
			for(int j = 0;j < 3;j++){
				for(int k = 0;k < 3;k++){
					if(calc(calc(calc(a,b,i),c,j),d,k) == 10){
						System.out.println("((("+a+" "+ctr[i]+" "+b+") "+ctr[j]+" "+c+") "+ctr[k] + " " + d +")");
						return 1;
					}else if(calc(calc(a,calc(b,c,j),i),d,k) == 10){
						System.out.println("(("+a+" "+ctr[i]+" ("+b+" "+ctr[j]+" "+c+")) "+ctr[k] + " " + d +")");
						return 1;
					}else if(calc(calc(a,b,i),calc(c,d,k),j) == 10){
						System.out.println("(("+a+" "+ctr[i]+" "+b+") "+ctr[j]+" ("+c+" "+ctr[k] + " " + d +"))");
						return 1;
					}
				}
			}
		}
		return 0;
	}
	
	int calc(int a,int b,int op){
		if(op == 0)return a+b;
		else if(op==1)return a-b;
		return a*b;
	}
	
	void doIt() {
		while(true){
			int a[] = new int [4];
			a[0] = sc.nextInt();
			a[1] = sc.nextInt();
			a[2] = sc.nextInt();
			a[3] = sc.nextInt();
			if(a[0]+a[1]+a[2]+a[3]==0)break;
			int num = 0;
			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 || i == k || i == l || j == k || j == l || k == l)continue;
							num = keisan(a[i],a[j],a[k],a[l]);
							if(num == 1)break;
						}
						if(num == 1)break;
					}
					if(num == 1)break;
				}
				if(num == 1)break;
			}
			if(num == 0){
				System.out.println(0);
			}
		}
	}
    public static void main(String[] args) {
    	new Main().doIt();
    }
}