📄 新建 文本文档.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 + -