/************************************************************************* > File Name: 24.cpp > Author: wangyeqiang > Mail: [email protected] > Created Time: 2013年04月30日 星期二 16时41分34秒 > 在一副扑克牌里四张扑克牌通过四则运算算出结果为24,以下是通过算法实现 > 列出所有能算出24点的4张牌,并给出算式 ************************************************************************/ #include <stdio.h> int total = 0; float option(int op,float a,float b) { switch(op) { case 0: return a+b; case 1: return a-b; case 2: return a*b; case 3: return a/b; } } char mark(int op) { switch(op) { case 0: return '+'; case 1: return '-'; case 2: return '*'; case 3: return '/'; } } /***************************************************************************** * 根据后缀表达式来判定其实只有四种种情况 * *1, A B i C j D k;->((A i B) j C) k D; * *2, A B C i j D k;->(A j (B i C)) K D; * *3, A B C D i j k;->A k (B j (C i D)); *4, A B i C D j k;->(A i B) K (C j D); * *其中A B C D代表数字,i,j,k代表四则运算中的一种 * *****************************************************************************/ void calculate(float a,float b,float c,float d) { for(int i=0;i<4;i++) for(int j=0;j<4;j++) for(int k=0;k<4;k++) { float temp; //情况1 temp = option(i,a,b); temp = option(j,temp,c); temp = option(k,temp,d); if(temp==24.0) { total++; printf("#%d ((A i B) j C) k D: ((%d%c%d)%c%d)%c%d\n",total,(int)a,mark(i),(int)b,mark(j),(int)c,mark(k),(int)d); } //情况2 temp = option(i,b,c); temp = option(j,a,temp); temp = option(k,temp,d); if(temp==24.0) { total++; printf("#%d (A j (B i C)) K D: (%d%c(%d%c%d))%c%d\n",total,(int)a,mark(j),(int)b,mark(i),(int)c,mark(k),(int)d); } //情况3 temp = option(i,c,d); temp = option(j,b,temp); temp = option(k,a,temp); if(temp==24.0) { total++; printf("#%d A K (B j (C i D)): %d%c(%d%c(%d%c%d))\n",total,(int)a,mark(k),(int)b,mark(j),(int)c,mark(i),(int)d); } //情况四 int temp1 = option(i,a,b); int temp2 = option(j,c,d); temp = option(k,temp1,temp2); if(temp==24.0) { total++; printf("#%d (A i B) k (C j D): (%d%c%d)%c(%d%c%d)\n",total,(int)a,mark(i),(int)b,mark(k),(int)c,mark(j),(int)d); } } } int main() { for(int a=1;a<=13;a++) for(int b=1;b<=13;b++) for(int c=1;c<=13;c++) for(int d=1;d<=13;d++) calculate((float)a,(float)b,(float)c,(float)d); }