⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 dos下算24点
💻 TXT
字号:
//计算24的程序(q24.cpp)
//日期:2004-3-23
//作者:qxh(031251085)
//*************************************************

#include <iostream>
using namespace std;

//**************************************************
void PrintHead();

void PrintRes(int[],int,float[],int);
void PrintEnd(int);
//*************************************************

void Calculate(int[],int,float [],int ,float &res);
bool NewRes(int[],int,float[],int,int[][7],int&);
void DoException(int[],int,float [],int,float &res);
void DoException2(int[],int,float [],int,int,int[][7],int &);
//void NewExp(int[],int,float [],int);

int num(0),num1(0),num3(0);
int num2;
bool EXP_SIGN1=false;
bool RIGHT=false;
bool EXP_SIGN2=false;
int main()
{
	char ch='y';
	while (ch=='y'||ch=='Y')
	{	PrintHead();                      //print head;
	//***************************************
	num=0; num1=0; num3=0;
	float a1,a2,a3,a4;
	float arr[4];
	int opr[3];
    int i1(0);
	int resArr[20][7];
	int resExpArr[20][7];
	int resExpArr2[20][7];


	cin >> a1>>a2>>a3>>a4;
	cout<<"开始计算……"<<endl<<endl;
	//******************************************
	while (i1<4)
	{
		int i2(0);
		while (i2<4 )
		{
		    while(i2==i1)
				i2++;
			if (i2==4)
				break;
			int i3(0);
			while (i3<4 )
			{
				while (i3==i1||i3==i2)
					i3++;
				if (i3==4)
					break;
				int i4(0);
				while (i4<4 )
				{
					while (i4==i1||i4==i2||i4==i3)
						i4++;
					if (i4==4)
					    break;

					arr[i1]=a1;
					arr[i2]=a2;
					arr[i3]=a3;
					arr[i4]=a4;

                    float res(0);

					for (int j1=0;j1<4;j1++)
						for (int j2=0;j2<4;j2++)
							for(int j3=0;j3<4;j3++)
							{	opr[0]=j1;
								opr[1]=j2;
								opr[2]=j3;

                                Calculate(opr,3,arr,4,res);

								if (res-24<0.0001 && res-24>-0.0001 && NewRes(opr,3,arr,4,resArr,num))
									PrintRes(opr,3,arr,4);

								if ((opr[0]<2&&opr[2]<2&&opr[1]>1)||(opr[0]>1&&opr[2]>1&&opr[1]<2))
								{
									EXP_SIGN1=true;
									DoException(opr,3,arr,4,res);
									if (res-24<0.0001 && res-24>-0.0001 && NewRes(opr,3,arr,4,resExpArr,num1))
										PrintRes(opr,3,arr,4);
								}
								EXP_SIGN1=false;

								for (int h=0;h<2;h++)
									if (opr[h]==3&&(opr[h+1]==0||opr[h+1]==1))
									{
										EXP_SIGN2=true;
										DoException2(opr,3,arr,4,h,resExpArr2,num3);
										PrintRes(opr,3,arr,4);
											EXP_SIGN2=false;
											RIGHT=false;

									}


								num2++;
							}
					i4++;
				}
				i3++;
			}
			i2++;
		}
		i1++;
	}

  PrintEnd(num2);
  cout <<"继续?y/n"<<endl;
  cin >>ch;
  while (ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N')
  {
	  cout << "请输入y或n:"<<endl;
	  cin>>ch;
  }
}

return 0;
}

void PrintHead()
{
	cout<<"计算24点"<<endl;
	cout<<"**********************"<<endl;
	cout<<"请输入4个数:"<<endl;
}

void PrintRes(int opr[],int n1,float arr[],int n2)
{
	char opr1[3];
	for (int k=0;k<n1;k++)
	{
		switch (opr[k])
		{
		case 0:
			opr1[k]='+';
			break;
		case 1:
			opr1[k]='-';
			break;
		case 2:
			opr1[k]='*';
			break;
		case 3:
			opr1[k]='/';
			break;
		}
	}
	if (EXP_SIGN1)
	{
		if (opr[0]<2)
			cout <<'('<<arr[0]<<opr1[0]<<arr[1]<<')'<<opr1[1]<<'('<<arr[2]<<opr1[2]<<arr[3]<<')';
		else
			cout <<arr[0]<<opr1[0]<<arr[1]<<opr1[1]<<arr[2]<<opr1[2]<<arr[3];
		cout <<endl;
		return;

	}
	if (EXP_SIGN2)
	{
	  if (RIGHT)
	  {

		 if (opr[1]==3)

		 {cout<<arr[0]<<opr1[0]<<'('<<arr[1]<<opr1[1]<<'('<<arr[2]<<opr1[2]<<arr[3]<<')'<<')';
		 cout<<endl;
		 return;
		 }


		 if (opr[0]==3)
		 {cout<<arr[0]<<opr1[0]<<'('<<arr[1]<<opr1[1]<<arr[2]<<opr1[2]<<arr[3]<<')';
		 cout <<endl;
		 return;
		 }

	  }
		return;
	}

	if (opr[0]<2 && opr[1]>1)
		cout <<'('<<arr[0]<<opr1[0]<<arr[1]<<')'<<opr1[1]<<arr[2]<<opr1[2]<<arr[3];
	else
		if( opr[1]<2 && opr[2]>1)

			cout<<'('<<arr[0]<<opr1[0]<<arr[1]<<opr1[1]<<arr[2]<<')'<<opr1[2]<<arr[3];
		else
			cout<<arr[0]<<opr1[0]<<arr[1]<<opr1[1]<<arr[2]<<opr1[2]<<arr[3];
	cout<<endl;

}

void PrintEnd(int num2)
{
	cout<<endl;
	cout<<"计算结束。";
	if ((num+num1+num3)==0)
		cout <<"没有结果。"<<endl;
	else
		cout<<"有"<<num+num1+num3<<"个结果"<<endl;
	cout<<endl;
	//cout<<"主循环次数:"<<num2<<endl;
	//cout <<num<<' '<<num1<<num3;
}

void Calculate(int opr[],int n1,float arr[],int n2,float &res)
{
	res=arr[0];
	int k(0);
	while (k<n1)
	{
		switch (opr[k])
		{
		case 0:
			res=res+arr[k+1];

			break;
		case 1:
			res=res-arr[k+1];
			break;
		case 2:
			res=res*arr[k+1];
			break;
		case 3:
			if (arr[k+1]==0)
				 res=25;
			else
		    res=res/arr[k+1];
			break;
		}
		k++;
	}
}


void DoException(int opr[],int n1,float arr[],int n2,float &res1)
{

     int i=0;
	 float res[3]={arr[0],0,arr[2]};
	 while(1)
	 {
		 switch (opr[i])
		 {
		 case 0:
			 res[i]=arr[i]+arr[i+1];
			 break;
		 case 1:
			 res[i]=arr[i]-arr[i+1];
			 break;
		 case 2:
			 res[i]=arr[i]*arr[i+1];
			 break;
		 case 3:
			 res[i]=arr[i]/arr[i+1];

		 }
		 if (i==2)
		 break;
		 i=2;
	 }
	 switch (opr[1])
		 {
		 case 0:
			 res[1]=res[0]+res[2];
			 break;
		 case 1:
			 res[1]=res[0]-res[2];
			 break;
		 case 2:
			 res[1]=res[0]*res[2];
			 break;
		 case 3:
			 if (res[2]==0)
				 res[1]=25;
			 else
			 res[1]=res[0]/res[2];
		 }
	 res1=res[1];

}

bool NewRes(int opr[],int n1,float arr[],int n2,int resArr[][7],int& num)
{
	if (num==0)
	{
		int i=0;
		for (;i<n1;i++)
			resArr[num][i]=opr[i];
		for (int j=0;j<n2;j++)
		{
			resArr[num][i]=arr[j];
				i++;
		}
		num++;
		return true;
	}

	int k=0;
	int find=num;
	bool oprfind;

	while (k<num)
	{
		oprfind=true;
		int a[4]={0,0,0,0};
		int b[4]={0,0,0,0};
		for (int j=0;j<n1;j++)
		{

			a[resArr[k][j]]++;
			b[opr[j]]++;
		}

		int i1=0;
		for (;i1<n1;i1++)
		{
			if (resArr[k][i1]!=opr[i1])
			{
				find--;
				oprfind=false;
				break;
			}
		}
		if (oprfind)
		{
			for (;i1<7;i1++)
			{
				if (resArr[k][i1]!=arr[i1-3])
				{
					find--;
					oprfind=false;
					break;
				}
			}
		}
		if (!oprfind&&!EXP_SIGN1&&!EXP_SIGN2)
		{
			if ((a[0]==b[0]&&a[1]==b[1]&&a[0]+a[1]==3)||(a[2]==b[2]&&a[3]==b[3]&&a[3]+a[2]==3))
				find++;
			else
				if (resArr[k][6]==arr[3]&&resArr[k][2]==opr[2])
			{
				if (resArr[k][5]!=arr[2]||resArr[k][1]!=opr[1])
				{if ((opr[2]==2||opr[2]==3)&&a[0]==b[0]&&a[1]==b[1]&&a[0]+a[1]==2)
					find++;
				else if ((opr[2]==0||opr[2]==1)&&a[2]==b[2]&&a[3]==b[3]&&a[2]+a[3]==2)
					find++;
				}
				else if (opr[0]==0||opr[0]==2)
					find++;
			}
				else if ((resArr[k][0]==opr[0]&&opr[0]==0||opr[0]==1)&&(a[2]==b[2]&&a[3]==b[3]&&a[3]+a[2]==2))
				{if (resArr[k][3]==arr[0]||resArr[k][3]==arr[1])
						find++;
				}
				else if ((resArr[k][0]==opr[0]&&opr[0]==2||opr[0]==3)&&(a[0]==b[0]&&a[1]==b[1]&&a[0]+a[1]==2))
				{	if (resArr[k][3]==arr[0]||resArr[k][3]==arr[1])
					find++;
				}


		}
		if (!oprfind&&EXP_SIGN1&&!EXP_SIGN2)
		{
			if (opr[1]==0||opr[1]==2)

			{
				if (resArr[k][0]==opr[2]&&resArr[k][2]==opr[0])

					find++;
				else if (resArr[k][0]==opr[0]&&resArr[k][2]==opr[2])
					find++;
			}
			else
			{
				if (resArr[k][0]==opr[0]&&resArr[k][2]==opr[2])
					find++;
			}
		}
		if (!oprfind&&EXP_SIGN2&&!EXP_SIGN1)
		{
			if (opr[0]==3&&(opr[1]==0||opr[1]==1))
			{if ((arr[0]==resArr[k][3])&&(a[0]==b[0]&&a[1]==b[1]&&a[0]+a[1]==2))
					find++;
			}
			else if (opr[1]==3)
			{
				if (opr[0]==2&&opr[2]==0)
				{
					if ((resArr[k][3]==arr[0]||resArr[k][3]==arr[1])&&(resArr[k][5]==arr[2]||resArr[k][5]==arr[3]))
						find++;
				}
				else if (opr[0]==2)
				{	if (resArr[k][3]==arr[0]||resArr[k][3]==arr[1])
						find++;
				}
					else if (opr[2]==0)
					{
						if (resArr[k][5]==arr[2]||resArr[k][5]==arr[3])
							find++;
					}
			}
		}

	k++;
	}
	if (find==0)
	{
		int i=0;
		for (;i<n1;i++)
			resArr[num][i]=opr[i];
		for (int j=0;j<n2;j++)
		{
			resArr[num][i]=arr[j];
				i++;
		}
		num++;
	}
	else return false;
	return true;

}
void DoException2(int opr[],int n1,float arr[],int n2,int n3,int resExpArr2[][7],int &num3)
{
	float res;
	if (n3==0)
	{
		res=arr[1];
		if (opr[2]==0||opr[2]==1)
		{
			for (int j=0;j<2;j++)
		   {
			   switch (opr[j+1])
			   {
			   case 0:
				   res=res+arr[j+2];
				   break;
			   case 1:
				   res=res-arr[j+2];
				   break;
			   }
		   }
		   if (res==0)  return;
		   res=arr[0]/res;
		   if (res-24>-0.0001&&res-24<0.0001&&NewRes(opr,3,arr,4,resExpArr2,num3))
		   RIGHT=true;
		}
		else if (opr[2]==3)
		{	if (arr[3]==0) return;
			if (opr[1]==0)
				res=res+arr[2]/arr[3];
			else res=res-arr[2]/arr[3];
			res=arr[0]/res;
		if (res-24>-0.0001&&res-24<0.0001&&NewRes(opr,3,arr,4,resExpArr2,num3))
		   RIGHT=true;
		}

	}
		else
		{
			res=arr[2];

				if (opr[2]==0)
					res=res+arr[3];
				else res=res-arr[3];
				if (res==0) return;
				res=arr[1]/res;
				switch (opr[0])
				{
				case 0:
					res=res+arr[0];
					break;
				case 1:
					res=arr[0]-res;
					break;
				case 2:
					res=res*arr[0];
					break;
				case 3:
					if (res==0)
						return;
					res=arr[0]/res;
					break;
				}
			if (res-24>-0.0001&&res-24<0.0001&&NewRes(opr,3,arr,4,resExpArr2,num3))
			RIGHT=true;
		}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -