//24点算法,思想就是表达式树,4个数字,3个符号只能建成两种树,目前还很难去重,这是遗憾
#include <stdio.h>
int data[5];//存储一开始输入的4个数字
int b[5];//存储符号
int a[5];//a[1]就是第一个输出的数字,以此类推,所以a[1~4]就应该对应data[1~4]里的数字
int sum;//统计有多少种方法
char ch[5]={'.','+','-','*','/'};
int f(int c,int d,int k)
{
if (k==1)
return c+d;
if (k==2)
return c-d;
if (k==3)
return c*d;
if (k==4)
if ((d!=0)&&(c%d==0))
return c/d;
return -10000;//否则就返回一个肯定不能成立的数字
}
void print1()
{
if ((b[1]>2)&&(b[2]<3))
printf("(%d %c %d)",a[1],ch[b[2]],a[2]);
else
printf("%d %c %d",a[1],ch[b[2]],a[2]);
printf(" %c ",ch[b[1]]);
if ((b[1]>2)&&(b[3]<3))
printf("(%d %c %d)=24\n",a[3],ch[b[3]],a[4]);
else
printf("%d %c %d=24\n",a[3],ch[b[3]],a[4]);
}
void print2()
{
if ((b[2]<3)&&(b[1]>2))
printf("(%d %c %d %c %d) %c %d=24\n",a[1],ch[b[3]],a[2],ch[b[2]],a[3],ch[b[1]],a[4]);
else
if ((b[2]>2)&&(b[3]<3))
printf("(%d %c %d)%c %d %c %d=24\n",a[1],ch[b[3]],a[2],ch[b[2]],a[3],ch[b[1]],a[4]);
else
printf("%d %c %d %c %d %c %d=24\n",a[1],ch[b[3]],a[2],ch[b[2]],a[3],ch[b[1]],a[4]);
}
void solve()
{
int i,j,k,p;
for (i=1;i<=4;i++)
for (j=1;j<=4;j++)
for (k=1;k<=4;k++)
for (p=1;p<=4;p++)
{
if ((i+j+k+p==10)&&(i*j*k*p==24))//如果i,j,k,p是全排列(在1234范围内,a+b+c+d=10和a*b*c*d=24只有一组解,当然你也可以直接判断a[1]!=a[2]!=a[3]!=a[4])
{
a[1]=data[i];
a[2]=data[j];
a[3]=data[k];
a[4]=data[p];
if (f(f(a[1],a[2],b[2]),f(a[3],a[4],b[3]),b[1])==24)//对于4个数,3个符号只有两种表达式树
{
sum++;
print1();
}
if (f(f(f(a[1],a[2],b[3]),a[3],b[2]),a[4],b[1])==24)
{
sum++;
print2();
}
}
}
}
int main()
{
int i,j,k;
for (i=1;i<=4;i++)
scanf("%d",&data[i]);
sum=0;
for (i=1;i<=4;i++)//1为加法,2为减法,3为乘法,4为除法
for (j=1;j<=4;j++)
for (k=1;k<=4;k++)
{
b[1]=i;
b[2]=j;
b[3]=k;
solve();
}
if (sum==0)
printf("无解~~\n");
return 0;
}
两种表达式树