C语言基础之24点算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【任务描述】
任意输入四个整数,数值范围(1~10),只能够用加、减、乘、除以及适当的括号来进行连接计算,无论顺序如何,使得计算结果为24,或者宣布根本就是无解的。
需要注意的是,每个数值必须都参与运算,并且只能够运算一次。
若输入数据小于1或者大于10,则提示输入错误,请重新输入。
若输入数据符合要求,且经过加、减、乘、除运算后,运算结果能得到24,则打印出该结果的计算表达式。
若输入不能运算出24的数据,则提示“输入的四位数据经过运算后不能得到24”。
【主要算法设计】
应用穷举法搜索整个解空间,筛选出符合题目要求的全部解。
关键的问题是如何确定该题的解空间。
假设输入的4个整数为A、B、C、D,如果不考虑括号优先级的情况,仅用四则运算符将它们连接,例如:A+B*C/D…,共有43=64种表达式情形。
如果考虑加括号的情况,暂不考虑运算符,共有以下5种情形:
((A□B)□C)□D
(A□(B□C))□D
A□(B□(C□D))
A□((B□C)□D)
(A□B)□(C□D)
其中□代表(+-*/)任意的运算符。
将上面两种情况综合起来考虑,每输入4个整数,其构成的解空间为64*5=320种表达式。
也就是说,每输入4个整数,无论以什么方式或优先级进行四则运算,其结果都会在这320种答案之中。
我们的任务就是在这320种表达式中寻找出计算结果为24的表达式。
【程序流程框图】
【详细设计】
#include "stdio.h"
char op[5]={'#','+','-','*','/',};
float cal(float x,float y,int op)
{
switch(op)
{
case 1:return x+y;
case 2:return x-y;
case 3: return x*y;
case 4: return x/y;
}
}
float calculate_model1(float i,float j,float k,float t,int op1,int op2,int op3)
{ /*对应表达式类型:((A□B)□C)□D*/ float r1,r2,r3;
r1 = cal(i,j,op1);
r2 = cal(r1,k,op2);
r3 = cal(r2,t,op3);
return r3;
}
float calculate_model2(float i,float j,float k,float t,int op1,int op2,int op3)
{ /*对应表达式类型:(A□(B□C))□D */ float r1,r2,r3;
r1 = cal(j,k,op2);
r2 = cal(i,r1,op1);
r3 = cal(r2,t,op3);
return r3;
}
float calculate_model3(float i,float j,float k,float t,int op1,int op2,int op3)
{ /*对应表达式类型:A□(B□(C□D))*/ float r1,r2,r3 ;
r1 = cal(k,t,op3);
r2 = cal(j,r1,op2);
r3 = cal(i,r2,op1);
return r3;
}
float calculate_model4(float i,float j,float k,float t,int op1,int op2,int op3)
{ /*对应表达式类型:A□((B□C)□D)*/ float r1,r2,r3;
r1 = cal(j,k,op2);
r2 = cal(r1,t,op3);
r3 = cal(i,r2,op1);
return r3;
}
float calculate_model5(float i,float j,float k,float t,int op1,int op2,int op3)
{ /*对应表达式类型:(A□B)□(C□D)*/
float r1,r2,r3 ;
r1 = cal(i,j,op1);
r2 = cal(k,t,op3);
r3 = cal(r1,r2,op2);
return r3;
}
int get24(int i,int j,int k,int t)
{
int op1,op2,op3;
int flag=0;
for(op1=1;op1<=4;op1++) /*4重循环枚举出不考虑括号情况的64种表达式类型*/ for(op2=1;op2<=4;op2++)
for(op3=1;op3<=4;op3++)
{
if(calculate_model1(i,j,k,t,op1,op2,op3)==24) /*5种加括号形式共320个表达式筛选24点*/
{
printf("((%d%c%d)%c%d)%c%d=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;
}
if(calculate_model2(i,j,k,t,op1,op2,op3)==24)
{
printf("(%d%c(%d%c%d))%c%d=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;
}
if(calculate_model3(i,j,k,t,op1,op2,op3)==24)
{
printf("%d%c(%d%c(%d%c%d))=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;
}
if(calculate_model4(i,j,k,t,op1,op2,op3)==24)
{
printf("%d%c((%d%c%d)%c%d)=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;
}
if(calculate_model5(i,j,k,t,op1,op2,op3)==24&&!(op2==4&&k==t)) /*排除分母为零的情况*/
{
printf("(%d%c%d)%c(%d%c%d)=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;
}
}
return flag;
}
void main()
{
int i,j,k,t;
do
{
printf("Please input four integer (1~10)\n");
loop: scanf("%d %d %d %d",&i,&j,&k,&t);
}while(i<1||i>10||j<1||j>10||k<1||k>10||t<1||t>10);
if(get24(i,j,k,t));
else printf("Sory, the four integer cannot be calculated to get 24\n");
getche();
}
【测试用例】
测试输入4、5、6、7
测试输入6、7、8、9
【调试运行结果】。