注册 登录
  • 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

C语言版的算24游戏代码

OC/C/C++ 水墨上仙 2660次浏览 已收录 手机上查看

给定4个1-9之间的数,通过加减乘除四则运算算出24来,可以使用括号

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
double sum(double a,double b)
{
	return a+b;
}
double mi(double a,double b)
{
	return a-b;
}
double mul(double a,double b)
{
	return a*b;
}
double di(double a,double b)
{
	return a/b;
}
double (*ops[4])(double a,double b)={sum,mi,mul,di};
double num[4];/*输入的数*/
double num3[4];/*第二次运算时暂时保存*/
double num4[4];/*第一次运算时暂时保存*/
double numf[4];/*输入的数保存输出时候用*/
/*复制数组*/
void copyarr(double *src,double *des)
{
	int i;
	double t[4];
	for(i=0;i<4;i++)
		des[i]=src[i];
}
/*第一次计算后,合并为前三个数*/
void reorder4(int cp4,double re4)
{
	switch(cp4)
	{
	case 0:
		num[0]=re4;
		num[1]=num[2];
		num[2]=num[3];
		break;
	case 1:
		num[1]=re4;
		num[2]=num[3];
		break;
	case 2:
		num[2]=re4;
		break;
	}
}
/*第二次计算后,合并为两个数*/
void reorder3(int cp3,double re3)
{
	switch(cp3)
	{
	case 0:
		num[0]=re3;
		num[1]=num[2];
		break;
	case 1:
		num[1]=re3;
		break;
	}
}
/*根据运算得到操作符*/
char opc(double(*opt)(double a,double b))
{
	if(opt==sum)
		return '+';
	else if(opt==mi)
		return '-';
	else if(opt==mul)
		return '*';
	else if(opt==di)
		return '/';
}
/*输出*/
void printresult(double *num,int ta3,int ta4,double(*op2)(double a,double b),double(*op3)(double a,double b),double(*op4)(double a,double b))
{
	double n0=num[0];
	double n1=num[1];
	double n2=num[2];
	double n3=num[3];
	switch(ta4)
	{
	case 0:
		if(ta3==0)
			printf("((%.0f%c%.0f)%c%.0f)%c%.0f\n",n0,opc(op4),n1,opc(op3),n2,opc(op2),n3);
		else if(ta3==1)
			printf("(%.0f%c%.0f)%c(%.0f%c%.0f)\n",n0,opc(op4),n1,opc(op2),n2,opc(op3),n3);
		break;
	case 1:
		if(ta3==0)
			printf("(%.0f%c(%.0f%c%.0f))%c%.0f\n",n0,opc(op3),n1,opc(op4),n2,opc(op2),n3);
		else if(ta3==1)
			printf("%.0f%c((%.0f%c%.0f)%c%.0f)\n",n0,opc(op2),n1,opc(op4),n2,opc(op3),n3);
		break;
	case 2:
		if(ta3==0)
			printf("(%.0f%c%.0f)%c(%.0f%c%.0f)\n",n0,opc(op3),n1,opc(op2),n2,opc(op4),n3);
		else if(ta3==1)
			printf("%.0f%c(%.0f%c(%.0f%c%.0f))\n",n0,opc(op2),n1,opc(op3),n2,opc(op4),n3);
		break;
	}
}
int main(void)
{
	int a,b,c,d;/*输入的数*/
	int cp3,cp4;/*cp3,cp4分别是第二次和第一次运算时的两个数运算,前一个数所在的位置*/
	int i,j,k;/*循环各种运算*/
	double re2,re3,re4;/*第3,2,1次运算的结果*/
	double(*cop2)(double a,double b);/*第3次操作符*/
	double(*cop3)(double a,double b);/*第2次操作符*/
	double(*cop4)(double a,double b);/*第1次操作符*/
	scanf("%d%d%d%d",&a,&b,&c,&d);
	num[0]=(double)a;
	num[1]=(double)b;
	num[2]=(double)c;
	num[3]=(double)d;
	/*每次运算之前备份,运算后合并以供后面的运算,但是如果没有找到解必须恢复备份*/
	copyarr(num,numf);
	copyarr(num,num4);
	for(cp4=0;cp4<=2;cp4++)
	{
		for(i=0;i<4;i++)
		{
			cop4=ops[i];
			re4=(*cop4)(num[cp4],num[cp4+1]);
			reorder4(cp4,re4);
			copyarr(num,num3);
			for(cp3=0;cp3<=1;cp3++)
			{
				for(j=0;j<4;j++)
				{
					cop3=ops[j];
					re3=(*cop3)(num[cp3],num[cp3+1]);
					reorder3(cp3,re3);
					for(k=0;k<4;k++)
					{
						cop2=ops[k];
						re2=(*cop2)(num[0],num[1]);
						if(re2==24)
						{
							printresult(numf,cp3,cp4,cop2,cop3,cop4);
							system("pause");
							return 0;
						}
					}
					copyarr(num3,num);
				}
			}
			copyarr(num4,num);
		}
	}
	system("pause");
	return 0;
}


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明C语言版的算24游戏代码
喜欢 (0)
[开心洋葱]
分享 (0)
关于作者:
水墨上仙
……
加载中……