算24,望能帮忙改进!
程序代码:#include<stdio.h>
#define s1(a1,b1,c1,d1) a1+b1+c1+d1
#define s2(a2,b2,c2,d2) a2+b2+c2*d2
#define s3(a3,b3,c3,d3) a3+b3*c3*d3
#define s4(a4,b4,c4,d4) a4*b4*c4*d4
//定义运算,这里出现一个弊端就是我的算24是有运算优先级的,就是说是在运算的时候默认是不能加括号的
int main()
{
int k[4],i,j,p,q;
int jisuan(int a,int b,int c,int d);
for(i=0;i<4;i++)
scanf("%d",&k[i]);
for(i=0;i<4;i++) //接下来是将输入的四个数都遍历一遍
for(j=0;j<4;j++){
if(j==i) continue;
for(p=0;p<4;p++){
if(p==i||p==j) continue;
for(q=0;q<4;q++){
if(q==i||q==j||q==p)
continue;
if(jisuan(k[i],k[j],k[p],k[q])==1){
printf("YES");
return 0;
}
}
}
}
printf("NO");
getchar();
getchar();
return 0;
}
int jisuan(int a,int b,int c,int d)
{
int result=0,i,j,p,q;
int za[2]={a,(-1*a)},zb[2]={b,(-1*b)},zc[2]={c,(-1*c)},zd[2]={d,(-1*d)};
double xa[2]={a,1.0/a},xb[2]={b,1.0/b},xc[2]={c,1.0/c},xd[2]={d,1.0/d};
//由于我宏定义中的运算只是加法跟乘法,所以我这里再定义出数组中含负数跟倒数的来代替除法跟减法,个人觉得是简便运算了。
for(i=0;i<=1;i++)
for(j=0;j<=1;j++)
for(p=0;p<=1;p++)
for(q=0;q<=1;q++)
if((s1(za[i],zb[j],zc[p],zd[q]))==24)
result=1;
for(i=0;i<=1;i++)
for(j=0;j<=1;j++)
for(p=0;p<=1;p++)
for(q=0;q<=1;q++)
if((s2(za[i],zb[j],zc[p],xd[q]))==24)
result=1;
for(i=0;i<=1;i++)
for(j=0;j<=1;j++)
for(p=0;p<=1;p++)
for(q=0;q<=1;q++)
if((s3(za[i],zb[j],xc[p],xd[q]))==24)
result=1;
for(i=0;i<=1;i++)
for(j=0;j<=1;j++)
for(p=0;p<=1;p++)
for(q=0;q<=1;q++)
if((s4(za[i],xb[j],xc[p],xd[q]))==24)
result=1;
//遍历四种运算
return result;
}
不知道有没有更简便的方法,我等于是用最笨的遍历的方法来处理,同时希望有大神能指导给出可以同一运算优先级的算法。(新手写代码,难免粗陋)









好强大,这多循环啊,飘过吧
