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)

#include<stdio.h>
#include<string.h>
int S[30],ST[9],N[7]={0,0,0,0,43,45,42},i,p,F[4]={0};

int calc()
{
	int i=p=0;
	for(i=0;i<7;i++)
	{
		if(S[i]>9)
		{
			if(p<2)return 0;
			else if(S[i]==43)ST[p-2]=ST[p-2]+ST[p-1];
			else if(S[i]==45)ST[p-2]=ST[p-2]-ST[p-1];
			else if(S[i]==42)ST[p-2]=ST[p-2]*ST[p-1];
			p-=1;
		}
		else ST[p++]=S[i];
	}
	return ST[0];
}
int dfs(int d,int f[4])
{
	int i;
	if(d==7)
	{
		if(calc()==10)
		{
			if(S[4]>9&&S[5]>9&&S[6]>9)return 0;
			else if(S[0]<10&&S[1]<10&&S[2]<10)return 0;
			else if(S[4]>9)
				printf("(((%d %c %d) %c %d) %c %d)\n",S[0],S[2],S[1],S[4],S[3],S[6],S[5]);
			else
				printf("((%d %c %d) %c (%d %c %d))\n",S[0],S[2],S[1],S[6],S[3],S[5],S[4]);
			return 1;
		}
		return 0;
	}
	for(i=0;i<7;i++)
	{
		if((i<4&&!f[i])||i>3)
		{
			f[i]=1;
			S[d]=N[i];
			if(dfs(d+1,f))return 1;
			f[i]=0;
		}
	}
	return 0;
}
int main()
{
	for(;~scanf("%d%d%d%d",&N[0],&N[1],&N[2],&N[3]),N[0];)
	{
		memset(F,0,16);
		if(dfs(0,F)==0)
			puts("0");
	}
	return 0;
}