用C语言编写的24点代码分析

# include & ltstdio.h & gt

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。