#include<stdio.h>
#include<math.h>
int Trial(float,float,float,float); //对四个数进行试算
float Calc(int,float,float); //计算
void Output(int,int,int,int,float,float,float,float);//输出结果
int iCount=0; //求解计数
int main()
{
int i,j,k,t,result,flag;
float num[4]; //保存输入的4个数
char again='y';
while(again=='y'||again=='Y')
{
iCount=0;
printf("输入四个数(1--13):");
i=0;
flag=0;
while(flag==0)
{
i++;
for(i=0;i<4;i++)
{
scanf("%f",&num[i]);
if(num[i]<1||num[i]>13||num[i]!=(int)num[i])
flag++;
}
if(flag!=0)
{
printf("数据输入错误,请重新输入\n");
flag=0;
}
else
flag=1;
}
//循环将四个数代入表达式进行计算
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(i==j)
continue;
for(k=0;k<4;k++)
{
if(i==k||j==k)
continue;
for(t=0;t<4;t++)
{
if(i==t||j==t||k==t)
continue;
else
result=Trial(num[i],num[j],num[k],num[t]);
}
}
}
}
if(result==0)
printf("这四个数无解\n");
printf("继续(y/n)?");
getchar();
again=getchar();
}
return 0;
}
int Trial(float data1,float data2,float data3,float data4) //对四个数进行试算
{
int o1,o2,o3;
float temp1,temp2,temp3;
for(o1=0;o1<4;o1++) //4种运算符
{
for(o2=0;o2<6;o2++) //6种运算符
{
for(o3=0;o3<6;o3++)
{
//处理第一种表达式 (((data1_data2)_data3)_data4)=24
if((!(o1==3&&data2==0))&&(!(o2==3&&data3==0)&&(!(o3==3&&data4==0))))
{
temp1=Calc(o1,data1,data2);
temp2=Calc(o2,temp1,data3);
temp3=Calc(o3,temp2,data4);
if(fabs(temp3-24)<0.1)
{
iCount++;
Output(1,o1,o2,o3,data1,data2,data3,data4);
}
}
//'*'
if(o3==2) //将乘法作为中间运算符 (data1_data2)*(data3_data4)=24
{
temp1=Calc(o1,data1,data2);
temp2=Calc(o2,data3,data4);
temp3=temp1*temp2;
if(fabs(temp3-24)<0.1)
{
iCount++;
Output(2,o1,o2,o3,data1,data2,data3,data4);
}
}
// '/'
if(o3==3) //将除法作为中间运算符 (data1_data2)/(data3_data4)=24
{
temp1=Calc(o1,data1,data2);
temp2=Calc(o2,data3,data4);
if(temp2)
{
temp3=temp1/temp2;
if(fabs(temp3-24)<0.1)
{
iCount++;
Output(2,o1,o2,o3,data1,data2,data3,data4);
}
}
}
}
}
}
return iCount;
}
float Calc(int oper,float data1,float data2)
{
if(oper==0)
return (data1+data2);
if(oper==1)
return (data1-data2);
if(oper==2)
return (data1*data2);
if(oper==3)
{
if(data2==0)
return 32767;
else
return (data1/data2);
}
if(oper==4)
return (data2-data1);
if(oper==5)
{
if(data1==0)
return 32767;
else
return (data2/data1);
}
return 0;
}
void Output(int type,int o1,int o2,int o3,float data1,float data2,float data3,float data4)
{
char oper[6]={'+','-','*','/','-','/'};//六种运算符
if(type==1)
{
// '-' 或'/'
if(o2==4||o2==5)
{
// '-' 或 '/'
if(o3==4||o3==5)
{
printf("解%d:",iCount);
printf("%2.0f%c(%2.0f%c(%2.0f%c%2.0f))=24\n",data4,oper[o3],data3,oper[o2],data1,oper[o1],data2);
}
else
{
printf("解%d:",iCount);
printf("(%2.0f%c(%2.0f%c%2.0f))%c%2.0f=24\n",data3,oper[o2],data1,oper[o1],data2,oper[o3],data4);
}
}
//'-' '/'
else if(o3==4||o3==5)
{
printf("解%d:",iCount);
printf("%2.0f%c((%2.0f%c%2.0f)%c%2.0f)=24\n",data4,oper[o3],data1,oper[o1],data2,oper[o2],data3);
}
else
{
printf("解%d:",iCount);
printf("((%2.0f%c%2.0f)%c%2.0f)%c%2.0f=24\n",data1,oper[o1],data2,oper[o2],data3,oper[o3],data4);
}
}
if(type==2)
{
if(o2==4||o2==5||o3==4||o3==5)
{
iCount--;
return;
}
printf("解%d:",iCount);
printf("(%2.0f%c%2.0f)%c(%2.0f%c%2.0f)=24\n",data1,oper[o1],data2,oper[o3],data3,oper[o2],data4);
}
}
C语言实现24点游戏
最新推荐文章于 2021-05-17 11:41:20 发布