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 C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mondai0041
{
	class Program
	{
		static void Main(string[] args)
		{
			while( true ) {
				var	n	= Array.ConvertAll( Console.ReadLine().Split(), s => int.Parse( s ) );
				if( n.Sum() == 0 ) {
					break;
				}
				expression( n );
			}
		}
	
		static void expression( int[] n )
		{
			for( int a = 0; a < 4; a++ ) {
				for( int b = 0; b < 4; b++ ) {
					if( a != b ) {
						for( int c = 0; c < 4; c++ ) {
							if( (a != c) && (b != c) ) {
								for( int d = 0; d < 4; d++ ) {
									if( (a != d) && (b != d) && (c != d) ) {
										if( is_expression_type_a( n[ a ], n [ b ], n[ c ], n[ d ] ) ) return;
										if( is_expression_type_b( n[ a ], n [ b ], n[ c ], n[ d ] ) ) return;
									}
								}
							}
						}
					}
				}
			}
			Console.WriteLine( 0 );
		}


		static bool is_expression_type_a( int a, int b, int c, int d )
		{
			char[]	ope	= { '+', '-', '*' };

			for( int e1 = 0; e1 < 3; e1++ ) {
				for( int e2 = 0; e2 < 3; e2++ ) {
					for( int e3 = 0; e3 < 3; e3++ ) {
						int	val	= 0; 
						switch( e1 ) {
						case	0:	val	+= a + b;	break;
						case	1:	val	+= a - b;	break;
						case	2:	val	+= a * b;	break;
						}
						switch( e2 ) {
						case	0:	val	+= c;	break;
						case	1:	val	-= c;	break;
						case	2:	val	*= c;	break;
						}
						switch( e3 ) {
						case	0:	val	+= d;	break;
						case	1:	val	-= d;	break;
						case	2:	val	*= d;	break;
						}
						if( val == 10 ) {
							Console.WriteLine( "(({0}{1}{2}){3}{4}){5}{6}", a, ope[ e1 ], b, ope[ e2 ], c, ope[ e3 ], d );
							return( true );
						}
					}
				}
			}
			return( false );
		}


		static bool is_expression_type_b( int a, int b, int c, int d )
		{
			char[]	ope	= { '+', '-', '*' };

			for( int e1 = 0; e1 < 3; e1++ ) {
				for( int e2 = 0; e2 < 3; e2++ ) {
					for( int e3 = 0; e3 < 3; e3++ ) {
						int	val1	= 0; 
						switch( e1 ) {
						case	0:	val1	+= a + b;	break;
						case	1:	val1	+= a - b;	break;
						case	2:	val1	+= a * b;	break;
						}
						int	val2	= 0; 
						switch( e3 ) {
						case	0:	val2	+= c + d;	break;
						case	1:	val2	+= c - d;	break;
						case	2:	val2	+= c * d;	break;
						}
						switch( e2 ) {
						case	0:	val1	+= val2;	break;
						case	1:	val1	-= val2;	break;
						case	2:	val1	*= val2;	break;
						}
						if( val1 == 10 ) {
							Console.WriteLine( "({0}{1}{2}){3}({4}{5}{6})", a, ope[ e1 ], b, ope[ e2 ], c, ope[ e3 ], d );
							return( true );
						}
					}
				}
			}
			return( false );
		}
	}
}