如何计算二十四点代码合集
概述
给定4个整数,其中每个数字只能使用一次;任意使用 – * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。这方面的程序很多,一般都是穷举求解。
基本原理
基本原理是穷举4个整数所有可能的表达式,然后对表达式求值。
表达式的定义: expression = (expression|number) operator (expression|number)
因为能使用的4种运算符 – * / 都是2元运算符,所以本文中只考虑2元运算符。2元运算符接收两个参数,输出计算结果,输出的结果参与后续的计算。
代码语言:txt复制#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=24n",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=24n",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))=24n",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)=24n",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)=24n",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");
}
第二种代码 (输出结果可能会有重复,没有第一种方法严谨)
C
代码语言:txt复制#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=24n",f[n]);
}
}
return 0;
}