C语言实现24点游戏

使用暴力枚举,主函数将四个数进行排列组合,调用calculate函数将运算符进行排列组合,一共有24*64=1536种计算方式。

#include <stdio.h>
#include <string.h>
char four_fun[4]={'+','-','*','/'};
float a[4];
int i,j,k,l;
float calculate(float a,float b,float c,float d);
float one_calculate(float a,float b,char c);

int main()
{
	int z;
	while(1)
	{
		for(z=0;z<4;z++)
		{
			scanf("%f",&a[z]);
			printf("ok\n");
		}
		/*将输入的四个数进行排列组合一共4*3*2*1=24种组合方式*/
		for(i=0;i<4;i++)
		{
			for(j=0;j<4;j++)
			{
				if(i==j)
				{
					continue; //跳过已经选择过的数值 跳过a[i],避免重复使用数字
				}
				else
				{
					for(k=0;k<4;k++)
					{	
						if((i==k)||(j==k))
						{
							continue;	
						}
						else 
						{
							for(l=0;l<4;l++)
							{
								if((i==l)||(j==l)||(k==l))
								{
									continue;
								}
								else
								{
									printf("=%d\n",(int)calculate(a[i],a[j],a[k],a[l]));
									//调用计算函数
								}
							}
						}
					}
				}	
			}	
		}
		printf(".......................................................\n");//分割线
	} 
}
float calculate(float a,float b,float c,float d)
{
	int i,j,m,n;
	float zero_t,one_t,two_t;
	/*将运算符进行枚举一共 4*4*4=64种方式*/
	for(i=0;i<4;i++)
	{
		zero_t=one_calculate(a,b,four_fun[i]);
		for(j=0;j<4;j++)
		{
			one_t=one_calculate(zero_t,c,four_fun[j]);
			for(m=0;m<4;m++)
			{
				two_t=one_calculate(one_t,d,four_fun[m]);
				if(two_t==24||two_t==-24)//此处为正负24 如果只有+24,例如(5-1/5)*5会计算成((5-1)/5)*5,增加负号会改变(5-1/5)*5中的优先级,变成(1/5-5)*5
					if(two_t>0)
					{	
						printf("((%d%c%d)%c%d)%c%d\n",(int)a,four_fun[i],(int)b,four_fun[j],(int)c,four_fun[m],(int)d);//有计算的优先级 例如 1,2,3,4 是((1*2)*3)*4这样的优先级
					}
					else
					{
					printf("-(%d%c%d%c%d)%c%d\n",(int)a,four_fun[i],(int)b,four_fun[j],(int)c,four_fun[m],(int)d);
					}
					return two_t;
				}
			}
		}		
	}
		
}
//此函数将ascii码中的加减转换为四则运算 a,b为运算的数字,c为运算符
float one_calculate(float a,float b,char c)
{
	float t;
	switch(c)
	{
		case '+':{
			t=a+b;
			break;
		}
		case '-':{
			t=a-b;
			break;
		}
		case '*':{
			t=a*b;
			break;
		}
		case '/':{
			t=a/b; 
			break;
		}
		default:break; 
	}
	return t;	
}

计算结果

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值