24点游戏

一、题目分析
随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
二、算法构造
24点游戏
三、算法实现

#include<stdio.h>
char op[5]={'#','+','-','*','/',};
float cal(float x,float y,int op)
{
   switch(op)
   {
     case 1:return x+y;
     case 2:return x-y;
     case 3: return x*y;
     case 4: return x/y;
   }
 }

float calculate_model1(float i,float j,float k,float t,int op1,int op2,int op3)
{
   float r1,r2,r3;
   r1 = cal(i,j,op1);
   r2 = cal(r1,k,op2);
   r3 = cal(r2,t,op3);
   return r3;
 }

float calculate_model2(float i,float j,float k,float t,int op1,int op2,int op3)
{
   float r1,r2,r3;
   r1 = cal(j,k,op2);
   r2 = cal(i,r1,op1);
   r3 = cal(r2,t,op3);
   return r3;
 }

float calculate_model3(float i,float j,float k,float t,int op1,int op2,int op3)
{
   float r1,r2,r3 ;
   r1 = cal(k,t,op3);
   r2 = cal(j,r1,op2);
   r3 = cal(i,r2,op1);
   return r3;
 }

float calculate_model4(float i,float j,float k,float t,int op1,int op2,int op3)
{
   float r1,r2,r3;
   r1 = cal(j,k,op2);
   r2 = cal(r1,t,op3);
   r3 = cal(i,r2,op1);
   return r3;
 }

float calculate_model5(float i,float j,float k,float t,int op1,int op2,int op3)
{
   float r1,r2,r3 ;
   r1 = cal(i,j,op1);
   r2 = cal(k,t,op3);
   r3 = cal(r1,r2,op2);
   return r3;
 }

get24(int i,int j,int k,int t)
{
     int op1,op2,op3;
     int flag=0;
     for(op1=1;op1<=4;op1++)
         for(op2=1;op2<=4;op2++)
             for(op3=1;op3<=4;op3++)
             {
				 if(calculate_model1(i,j,k,t,op1,op2,op3)==24)
				 {
					 printf("((%d%c%d)%c%d)%c%d=24\n",i,op[op1],j,op[op2],k,op[op3],t);
					 flag = 1;
				 }
				 if(calculate_model2(i,j,k,t,op1,op2,op3)==24)
				 {
					 printf("(%d%c(%d%c%d))%c%d=24\n",i,op[op1],j,op[op2],k,op[op3],t);
					 flag = 1;
				 }
				 if(calculate_model3(i,j,k,t,op1,op2,op3)==24)
				 {
					 printf("%d%c(%d%c(%d%c%d))=24\n",i,op[op1],j,op[op2],k,op[op3],t);
					 flag = 1;
				 }
				 if(calculate_model4(i,j,k,t,op1,op2,op3)==24)
				 {
					 printf("%d%c((%d%c%d)%c%d)=24\n",i,op[op1],j,op[op2],k,op[op3],t);
					 flag = 1;
				 }
				 if(calculate_model5(i,j,k,t,op1,op2,op3)==24)
				 {
					 printf("(%d%c%d)%c(%d%c%d)=24\n",i,op[op1],j,op[op2],k,op[op3],t);
					 flag = 1;
				 }
			 }
			 return flag;
} 

main()
{
         int i,j,k,t,a[4];
         srand((unsigned)time(NULL));   //随机种子
         printf("四个数是:\n");
         for(i=0;i<4;i++)
		 {
			 a[i]=rand()%12+1;     //获得随机数
if(a[i]==1)
			 {
				 a[i]='A';
			 }
			 if(a[i]==11)
			 {
				 a[i]='J';
			 }
			 if(a[i]==12)
			 {
				 a[i]='Q';
			 }
			 if(a[i]==13)
			 {
				 a[i]='K';
			 }
			 printf("%4d\n",a[i]);
		 }
         i=a[0];
		 j=a[1];
		 k=a[2];
		 t=a[3];
		 printf("可以得到结果24的计算方法:\n");
         get24(i,j,k,t);
 }

四、运行结果
(1)无法得出24时
24点游戏
(2)可以得出24时
24点游戏
五、经验归纳
刚看到这个问题时,感觉是自己一点思路都没有,知道24如何去算问题想的清楚,但对于算法感到棘手无从下手,是在网上查阅了相关资料,看了看前人所写的代码,对于整体框架有了大致把握才开始写,但中途有部分算法还是参照别人的写的,感觉自己有点失败,感觉自己还是应该多多加强算法练习。