#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 400
#define U 24.0
#define NS 100
char c[]={'+','-','*','/','^','@'
,'&','|','<','>'};
float f[N];char g[N-1];
int u[N+N-1];
int M;int n;
float polan(int *d,int k)
{int m=0,i;
float v[N],v1,v2;
for(i=k-1;i>=0;i--)
{
if(d[i]<n)v[m++]=f[d[i]];
else
{
v2=v[--m];
v1=v[--m];
switch(g[d[i]-n])
{
case '+':if(v1>v2)return U-4;
v[m++]=v1+v2; break;
case '-':if(v1-v2<0)return U-2;
v[m++]=v1-v2; break;
case '*':if(v1>v2)return U-5;
v[m++]=v1*v2; break;
case '/':if(v2==0)return U-3;
v[m++]=v1/v2; break;
case '^':v[m++]=pow(v1,v2);break;
case '@':v[m++]=pow(v1,1/v2);break;
case '&':if((int)v1!=v1||(int)v2!=v2||v1>v2)return U-6;
v[m++]=(int)v1&(int)v2;break;
case '|':if((int)v1!=v1||(int)v2!=v2||v1>v2)return U-7;
v[m++]=(int)v1|(int)v2;break;
case '<':if(v2<=0||v2>31||(int)v1!=v1||(int)v2!=v2)return U-8;
v[m++]=(int)v1<<(int)v2;break;
case '>':if(v2<=0||v2>31||(int)v1!=v1||(int)v2!=v2)return U-9;
v[m++]=(int)v1>>(int)v2;
break;
}
}
}
return v[0];
}
int printp(int *d,int k)
{int m=0,i;
char s[N][NS],s1[NS],s2[NS];
for(i=k-1;i>=0;i--)
{
if(d[i]<n)sprintf(s[m++],"%5.2f",f[d[i]]);
else
{
strcpy(s2,s[--m]);
strcpy(s1,s[--m]);
sprintf(s[m++],"(%s%c%s)",s1,g[d[i]-n],s2);
}
}
printf("%s=%5.2f\n",s[0],U);
return 0;
}
void swap(int*a,int*b)
{ int j=*a;*a=*b;*b=j;}
int judge(int m,int b,int c,
int *b1,int *c1)
{
int k;
if(u[m-1]>=n)
for(k=m;k<n+n-1;k++)
if(u[k]>=n)
if(u[k]>u[m-1])return 0;
if(u[m-1]<n){*b1=b+1;*c1=c;}
else {*b1=b;*c1=c+1;}
if(*c1>=*b1)return 0;
if(u[m-1]<n)
for(k=m;k<n+n-1;k++)
if(u[k]<n&&f[u[k]]==f[u[m-1]])
if(u[k]>u[m-1])return 0;
return 1;
}
int q(int m)
{
int i;
if(m==0) return 1;
for(i=0;i<M;i++)
{
g[m-1]=c[i];
if(q(m-1))
if(polan(u,n+n-1)==U)
printp(u,n+n-1);
}
return 0;
}
int p(int m,int b,int c)
{
int i,b1,c1;
if(m==0) return 1;
for(i=0;i<m;swap(u+i,u+m-1),i++)
{
swap(u+i,u+m-1);
if(!judge(m,b,c,&b1,&c1))continue;
if(p(m-1,b1,c1))q(n-1);
}
return 0;
}
int main()
{
float v;
int i;
printf("input how many:");
scanf("%d",&n);
if(n<0){n=-n;M=10;}else M=4;
for(i=0;i<n;i++)
{
printf("%d:",i+1);
scanf("%f",f+i);
}
for(i=0;i<n+n-1;i++)u[i]=i;
p(n+n-1,0,0);
return 0;
}