用C语言编写的24点代码分析
Doublefun (DoubleA1,DoubleA2,int b)//尝试计算的函数,其中b为运算控制。
{
开关(b)
{
情况0:返回(a 1+a2);
案例1:返回(a 1-a2);
情况二:返回(a 1 * a2);
情况三:返回(a 1/a2);
}
}
void main()
{
int i,j,k,l,n,m,r,save[4];
double num[4]={1,1,1,1},tem1,tem2,tem3,ABC = 111;
字符符号[5]= "+-*/";//打印时使用的符号要和fun函数中的顺序一致。
printf("输入4个数字:");
for(I = 0;我& lt4;i++)
{
scanf("%lf ",num+I);//输入数据
save[I]= num[I];//保存原始数据
}
//下面这个程序的思路是用穷举(其实就是用的排列组合法)来计算可能的组合。
//排列先输入的四个数字(语句的前四个数字就是为了这个目的)
//然后依次插入三个运算符(最后三个for语句就是为了这个目的)
//其实从这里看,这个节目并不怎么样。七层循环嵌套,这是编程的大忌。一般最好不要嵌套超过两层。
for(I = 0;我& lt4;i++)
for(j = 0;j & lt4;j++)
如果(j!=i)
{
for(k = 0;k & lt4;k++)
如果(k!= i & amp& ampk!=j)
{
for(l = 0;l & lt4;l++)
如果(l!= i & amp& amp我!= j & amp& amp我!=k)
{
for(n = 0;n & lt4;n++)
for(m = 0;m & lt4;m++)
for(r = 0;r & lt4;r++)
{
tem1=fun(num[i],num[j],n);
tem2=fun(tem1,num[k],m);
tem3=fun(tem2,num[l],r);
//以下五种处理方法涵盖了所有可能的操作顺序。
//这也是这个节目最精致的地方。
If(tem3==24.0)//如果直接计算24,则表示顺序不变,直接输出为。
printf(" {(% d % c % d)% c % d } % c % d = 24 \ n ",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
Else if(tem3==-24.0)//如果计算结果为负,则意味着需要进行第二次运算的逆运算(第三次运算不能是加减法)。
printf(" { % d % c(% d % c % d)} % c % d = 24 \ n ",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);
Else if(tem3==1.0/24.0)//如果是倒数,则表示上一次运算需要反转(第三次运算也不能是加法或减法)。
printf(" % d % c {(% d % c % d)% c % d } = 24 \ n ",save[l],sign[r],save[i],sign[n],save[j],sign[m],save[k]);
else If(TEM 3 =-1.0/24.0)//如果是负倒数,说明第二个和第三个运算必须反过来(第三个运算不能是加法或减法)。
printf(" % d % c { % d % c(% d % c % d)} = 24 \ n ",save[l],sign[r],save[k],sign[n],save[i],sign[m],save[j]);
其他
{//Handling () */+/-()
tem1=fun(num[i],num[j],n);
tem2=fun(num[k],num[l],r);
tem3=fun(tem1,tem2,m);
if(tem3==24.0)
printf("(% d % c % d)% c(% d % c % d)= 24 \ n ",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);
}
}
}
}
}
}
//经过进一步的研究,我发现“第三次不可能是加减法”的想法是错误的,程序的作者在设计的时候确实是这么想的,所以这个程序是有问题的。
//但是节目中的主旨没有错。如果需要纠正这个错误,程序需要在判断操作顺序上下功夫。结果只能是==24。