新人入门——24点

新人入门——24点的计算

从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1)随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式

算法设计思路:

24点算法有4个随机数以及中间的三个符号组成,四个数字的排列组合有24种情况,3个符号有4的3次方种情况,对这1526种情况进行计算寻找能形成24点的情况,同时记录下已经形成24点的符号数字,若之后形成的24点算法出现的数字和符号都相同,则视为重复情况,不再记录。

源代码:

#include <iostream>
#include "stdlib.h"
#include "time.h"
#include "string.h"

using namespace std; 

int find24=0;		//find24用来记录是否存在24的算法 
int outmain=0;		//储存了是否结束主函数的变量 
int cfu=0;		//计数 
int cf[7][10]; 		//用于存放能形成24点的情况

char fh(int a)		//根据输入的数返回符号 
{
		switch(a)
	{
		case 1:
			return('+');		//1表示加号 
		case 2:
			return('-');		//2表示减号 
		case 3:
			return('*');		//3表示乘号 
		case 4:
			return('/');		//4表示除号 
		default:
			break;
	}
}

double suan(double a,double b,int s)		//计算输入的a和b,s表示运算符号 
{
	double an=0;
	switch(s)
	{
		case 1:
			an=a+b;	break;
		case 2:
			an=a-b;break;
		case 3:
			an=a*b;break;
		case 4:
			an=a/b;break;
		default:
			break;
	}
	return an;		//返回计算结果 
}

void suan2(int a,int b,int c,int d,int s1,int s2,int s3)		//abcd为输入的四个数,s123表示运算符号 
{
	double zhong;
	char fhw[3];
	fhw[0]=fh(s1); fhw[1]=fh(s2); fhw[2]=fh(s3); 		//将s123转换为运算符 
	zhong=suan(a,b,s1);			//计算a和b 
	zhong=suan(zhong,c,s2);			//计算ab后的结果再和c计算 
	zhong=suan(zhong,d,s3);			//计算abc后再与d计算 
	if(zhong==24)		//如果得到了24点,输出结果 
	{
		int shud=0; 
		cf[0][cfu]=a;cf[1][cfu]=b;cf[2][cfu]=c;cf[3][cfu]=d;		//储存结果 
		cf[4][cfu]=s1;cf[5][cfu]=s2;cf[6][cfu]=s3;
		for(int i=0;i<cfu;i++)
			for(int j=0;j<4;j++)
			{
				for(int k=0;k<4;k++)
					if(cf[j][i]==cf[k][cfu])
					{	shud++;
						break;
					}	
			}
		for(int i=0;i<cfu;i++)
			for(int j=4;j<7;j++)
			{
				for(int k=4;k<7;k++)
					if(cf[j][i]==cf[k][cfu])
					{	
						shud++;
						break; 
					}	
			}
		if(shud>=7)			//如果计算得出的数字和符号和之前的算法都相同,不记录 
		{
			cf[0][cfu]=0;cf[1][cfu]=0;cf[2][cfu]=0;cf[3][cfu]=0;
			cf[4][cfu]=0;cf[5][cfu]=0;cf[6][cfu]=0;
			return;
		}
		cfu++;
		cout<<"("<<"("<<a<<fhw[0]<<b<<")"<<fhw[1]<<c<<")"<<fhw[2]<<d<<"=24"<<endl;
		find24=1;		//find24为1表示找到了一种算法能得到24 
	}
}

int main(int argc, char** argv)
{ 
	int a[4];		//用于存放四个随机数 
	loop:srand((unsigned)time(NULL));		//保证每次产生的随机数不同 
	for(int i=0;i<4;i++)		//输入随机数 
		a[i]=rand()%13+1;
	cout<<"生成的数是:"; 
	for(int i=0;i<4;i++)
		cout<<a[i]<<" ";		//输出随机数 
	cout<<endl;	
	int jjcc[3]={1,1,1};		//jjcc记录了四个数中间的三个运算符 
	while(jjcc[0]<4)		 
		{				
			while(jjcc[1]<4)
				{
					while(jjcc[2]<4)		//需要计算四个数排列组合形成的24种情况 
					{ 
						suan2(a[0],a[1],a[2],a[3],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[0],a[1],a[3],a[2],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[0],a[2],a[1],a[3],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[0],a[2],a[3],a[1],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[0],a[3],a[2],a[1],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[0],a[3],a[1],a[2],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[1],a[0],a[2],a[3],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[1],a[0],a[3],a[2],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[1],a[2],a[0],a[3],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[1],a[2],a[3],a[0],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[1],a[3],a[2],a[0],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[1],a[3],a[0],a[2],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[2],a[1],a[0],a[3],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[2],a[1],a[3],a[0],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[2],a[0],a[1],a[3],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[2],a[0],a[3],a[1],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[2],a[3],a[0],a[1],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[2],a[3],a[1],a[0],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[3],a[1],a[2],a[0],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[3],a[1],a[0],a[2],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[3],a[0],a[2],a[1],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[3],a[0],a[1],a[2],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[3],a[2],a[0],a[1],jjcc[0],jjcc[1],jjcc[2]);
						suan2(a[3],a[2],a[1],a[0],jjcc[0],jjcc[1],jjcc[2]);
						jjcc[2]++;
					}					
					jjcc[1]++;jjcc[2]=1;		//每次此层循环结束,重置第三个运算符 
				}
			jjcc[0]++;jjcc[1]=1;jjcc[2]=1;	 		//每次此层循环结束,重置第二个和第三个运算符 
		} 
	if(find24==0)		//没有找到24点方法的提示 
		cout<<"没有算法可以使四个数形成24点!";
	back:cout<<"是否再来一次?"<<endl;		//在输入了不是0和1的数会跳转回这里 
	cout<<"0.退出 1.再来一次"<<endl; 
	cin>>outmain; 
	if(outmain==1)			//再来一次会跳转至产生随机数的地方 
	{		
		find24=0;			//同时默认没找到24点的算法 
		cfu=0;
		memset(cf,0,sizeof(cf));
		goto loop;
	}			
	else if(outmain==0) 		//退出会退出程序 
		return 0;
	else		//在输入了非0和1的数时跳转到是否再来一次的地方 
	{
		cout<<"输入了既不是0,也不是1的数!"<<endl;
		goto back; 
	}	
}

测试截图:

在这里插入图片描述