算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; }不知道有没有更简便的方法,我等于是用最笨的遍历的方法来处理,同时希望有大神能指导给出可以同一运算优先级的算法。(新手写代码,难免粗陋)