/**
*@ 随机生成4个代表扑克牌牌面的数字或字母,程序自动列出所有可能算出24的表达式
*@ 西安科技大学 软工1702班
*@ author:侯明会
*@ C语言
*@ Dev-C++
*@ 2019/4/2
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int temp=0;//判断是否有解决方案
double get(double a,char c,double b)//两个数之间的运算
{
switch(c)
{
case '+':return a+b;break;
case '-':return a-b;break;
case '*':return a*b;break;
case '/':return a/b;break;
}
}
void display(double a,double b,double c,double d)//按随机生成的四个数中的一个顺序进行运算
{
//共有三个运算符,通过循环将每一种运算符排列情况列出来
char c1,c2,c3;
for(int i=0;i<4;i++)//第一个运算符的排列情况
{
if(i==0) c1='+';
if(i==1) c1='-';
if(i==2) c1='*';
if(i==3) c1='/';
for(int j=0;j<4;j++)//第二个运算符的排列情况
{
if(j==0) c2='+';
if(j==1) c2='-';
if(j==2) c2='*';
if(j==3) c2='/';
for(int k=0;k<4;k++)//第三个运算符的排列情况
{
if(k==0) c3='+';
if(k==1) c3='-';
if(k==2) c3='*';
if(k==3) c3='/';
if(get(get(get(a,c1,b),c2,c),c3,d)==24.0)//1.通过两两运算 :(((a先与b)再与c)最后与d)
{
temp=1;
printf("(((%.1lf%c%.1lf)%c%.1lf)%c%.1lf)\n",a,c1,b,c2,c,c3,d);
}
if(get(get(a,c1,b),c2,get(c,c3,d))==24.0)//2.通过两两运算 :((a先与b)再与(c先与d))
{
temp=1;
printf("((%.1lf%c%.1lf)%c(%.1lf%c%.1lf))\n",a,c1,b,c2,c,c3,d);
}
if(get(get(a,c1,get(b,c2,c)),c3,d)==24.0)//3.通过两两运算 :((a再与(b先与c))最后于d)
{
temp=1;
printf("((%.1lf%c(%.1lf%c%.1lf))%c%.1lf)\n",a,c1,b,c2,c,c3,d);
}
if(get(a,c1,get(get(b,c2,c),c3,d))==24.0)//4.通过两两运算 :(a最后与((b先与c)再与d))
{
temp=1;
printf("(%.1lf%c((%.1lf%c%.1lf)%c%.1lf))\n",a,c1,b,c2,c,c3,d);
}
if(get(a,c1,get(b,c2,get(c,c3,d)))==24.0)//5.通过两两运算 :(a最后与(b再与(c先与d)))
{
temp=1;
printf("(%.1lf%c(%.1lf%c(%.1lf%c%.1lf)))\n",a,c1,b,c2,c,c3,d);
}
}
}
}
}
void solve(double p[4])//按随机生成的四个数可能的顺序一一调用运算函数
{
display(p[0], p[1], p[2], p[3]);
display(p[0], p[1], p[3], p[2]);
display(p[0], p[2], p[1], p[3]);
display(p[0], p[2], p[3], p[1]);
display(p[0], p[3], p[1], p[2]);
display(p[0], p[3], p[2], p[1]);
display(p[1], p[0], p[2], p[3]);
display(p[1], p[0], p[3], p[2]);
display(p[1], p[2], p[0], p[3]);
display(p[1], p[3], p[0], p[2]);
display(p[1], p[2], p[3], p[0]);
display(p[1], p[3], p[2], p[0]);
display(p[2], p[0], p[1], p[3]);
display(p[2], p[0], p[3], p[1]);
display(p[2], p[1], p[0], p[3]);
display(p[2], p[3], p[0], p[1]);
display(p[2], p[1], p[3], p[0]);
display(p[2], p[3], p[1], p[0]);
display(p[3], p[0], p[1], p[2]);
display(p[3], p[0], p[2], p[1]);
display(p[3], p[1], p[0], p[2]);
display(p[3], p[2], p[0], p[1]);
display(p[3], p[1], p[2], p[0]);
display(p[3], p[2], p[1], p[0]);
}
int main()
{
double a[4];
int k=1,x;//判断是否继续循环生成随机数并运算
while(k)//通过循环多次进行24点运算
{
srand((unsigned)time(NULL));
for(int i=0;i<4;i++)//随机生成四个数
{
a[i]=rand()%13+1.0;
}
printf("随机生成的四个数为:\n");
printf("%.1lf,%.1lf,%.1lf,%.1lf\n",a[0],a[1],a[2],a[3]);
printf("解决方案(可能包含重复表达式)如下:\n");
solve(a);
if(temp==0) printf("所生成的四个随机数无法计算成24\n");
temp=0;//使得继续循环时,可以显示无解决方案时的结果
printf("退出请按0 or 继续请按1:\n");
scanf("%d",&x);
if(x==0) k=0;
}
}
运行结果(可能有重复的表达式)如下图所示: