如何计算二十四点代码合集
概述
给定4个整数,其中每个数字只能使用一次;任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。这方面的程序很多,一般都是穷举求解。
基本原理
基本原理是穷举4个整数所有可能的表达式,然后对表达式求值。
表达式的定义: expression = (expression|number) operator (expression|number)
因为能使用的4种运算符 + - * / 都是2元运算符,所以本文中只考虑2元运算符。2元运算符接收两个参数,输出计算结果,输出的结果参与后续的计算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#include<stdio.h> char mark[4]={'+','-','*','/'}; float cal(float x,float y,int mark) { switch(mark) { case 0:return x+y; case 1:return x-y; case 2:return x*y; case 3:return x/y; } } float calculate_A(float a,float b,float c,float d,int mark1,int mark2,int mark3) { float r1,r2,r3; r1=cal(a,b,mark1); r2=cal(r1,c,mark2); r3=cal(r2,d,mark3); return r3; } float calculate_B(float a,float b,float c,float d,int mark1,int mark2,int mark3) { float r1,r2,r3; r1=cal(b,c,mark2); r2=cal(a,r1,mark1); r3=cal(r2,d,mark3); return r3; } float calculate_C(float a,float b,float c,float d,int mark1,int mark2,int mark3) { float r1,r2,r3; r1=cal(c,d,mark3); r2=cal(b,r1,mark2); r3=cal(a,r2,mark1); return r3; } float calculate_D(float a,float b,float c,float d,int mark1,int mark2,int mark3) { float r1,r2,r3; r1=cal(b,c,mark2); r2=cal(r1,d,mark3); r3=cal(a,r2,mark1); return r3; } float calculate_E(float a,float b,float c,float d,int mark1,int mark2,int mark3) { float r1,r2,r3; r1=cal(a,b,mark1); r2=cal(c,d,mark3); r3=cal(r1,r2,mark2); return r3; } float get(int a,int b,int c,int d) { int mark1,mark2,mark3; float flag=0; for(mark1=0;mark1<4;mark1++) { for(mark2=0;mark2<4;mark2++) { for(mark3=0;mark3<4;mark3++) { if(calculate_A(a,b,c,d,mark1,mark2,mark3)==24) { printf("((%d%c%d)%c%d)%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1; } if(calculate_B(a,b,c,d,mark1,mark2,mark3)==24) { printf("(%d%c(%d%c%d))%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1; } if(calculate_C(a,b,c,d,mark1,mark2,mark3)==24) { printf("%d%c(%d%c(%d%c%d))=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1; } if(calculate_D(a,b,c,d,mark1,mark2,mark3)==24) { printf("%d%c((%d%c%d)%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1; } if(calculate_E(a,b,c,d,mark1,mark2,mark3)==24) { printf("(%d%c%d)%c(%d%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1; } } } } return flag; } main() { int a,b,c,d; printf("Please input 4 numbers(1~13):"); scanf("%d%d%d%d",&a,&b,&c,&d); if((a>=1&&a<=13)&&(b>=1&&b<=13)&&(c>=1&&c<=13)&&(d>=1&&d<=13)) { get(a,b,c,d); } else { printf("Input illegal,please input again(1~13):"); scanf("%d%d%d%d",&a,&b,&c,&d); if((a>=1&&a<=13)&&(b>=1&&b<=13)&&(c>=1&&c<=13)&&(d>=1&&d<=13)) { get(a,b,c,d); } } system("pause"); } |
第二种代码
(输出结果可能会有重复,没有第一种方法严谨)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#include<stdio.h> int chu(int p,int q) { if(p%q==0)return p/q; else return 111111; } int fun(int i,int j,int c) { int s; switch(c) { case 1:s=i+j;break; case 2:s=i-j;break; case 3:s=i*j;break; case 4:s=chu(i,j);break; } return s; } void print(int c) { if(c==1)printf("+"); else if(c==2)printf("-"); else if(c==3)printf("*"); else printf("/"); } int main() { int f[4]; int i,j,m,n; int a,b,c; int d1,d2,d3; scanf("%d%d%d%d",&f[0],&f[1],&f[2],&f[3]); for(i=0;i<4;i++) for(j=0;j<4;j++) if(j!=i) for(m=0;m<4;m++) if(m!=i&&m!=j) for(n=0;n<4;n++) if(n!=i&&n!=j&&n!=m) for(a=1;a<5;a++) for(b=1;b<5;b++) for(c=1;c<5;c++) { d1=fun(f[i],f[j],a); d2=fun(d1,f[m],b); d3=fun(d2,f[n],c); if(d3==24) { printf("%d",f[i]); print(a); printf("%d",f[j]); print(b); printf("%d",f[m]); print(c); printf("%d=24\n",f[n]); } } return 0; } |