从扑克中每次取出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; } }