本程序并不能去掉全部冗余解,只是去掉一部分,并且写的尽可能简单,仅供大家参考。(注意:直接复制本段代码是无法正常运行的,除非手动重写-,-嘿嘿)#include <stdio.h> #define forT for(t2=t1;t2<3;t2++)t[t2]=t[t2+1];#define GetNum(n) {if(t1>0 && t[t1-1]==t[t1])continue;n=t[t1];forT}#define isTrue if(23.9999<total && total<24.0001)#define argment n1,GetSym(sym1),n2,GetSym(sym2),n3,GetSym(sym3),n4#define pt(str) printf(str,argment);SearchCount++;continue;#define fsym(s) for(long s=0;s<4;s++)#define isSct(s1,s2) if(!(s1==1 && s2<=1 || s1==3 && s2>=2))#define tct total=countchar GetSym(long symbol) { switch(symbol) { case 0: return '+'; case 1: return '-'; case 2: return '*'; default: return '/'; } } double count(double num1,double num2,long symbol) { switch(symbol) { case 0: if(num1>=num2)return num1+num2;else return -1e10; case 1: if(num2!=0)return num1-num2;else return -1e10; case 2: if(num1>=num2)return num1*num2;else return -1e10; default:if((num2<-0.0001 || 0.0001<num2)&& num2!=1) return num1/num2;else return -1e10; } } int main(int argc, char* argv[]) {//雨中飞燕之作 long m[4],SearchCount=0,n1,n2,n3,n4; printf("Input 4 Numbers(a,b,c,d):\n"); scanf("%d,%d,%d,%d",&m[0],&m[1],&m[2],&m[3]); for(n2=0;n2<3;n2++)for(n1=3;n1>=n2;n1--) if(m[n1]>m[n1+1])n3=m[n1+1],m[n1+1]=m[n1],m[n1]=n3; for(long z1=0;z1<24;z1++) { long z2=z1 % 6,t1=z1/6,t2,t[4]={m[0],m[1],m[2],m[3]}; GetNum(n1)t1=z2/2;z2%=2;GetNum(n2)t1=z2;GetNum(n3)n4=t[0]; fsym(sym1)fsym(sym2)fsym(sym3) { double total,total2=count(n3,n4,sym3); tct(n1,n2,sym1);tct(total,n3,sym2);tct(total,n4,sym3); isTrue{pt("((%d%c%d)%c%d)%c%d\n")} tct(n2,n3,sym2);tct(n1,total,sym1);tct(total,n4,sym3); isSct(sym1,sym2)isTrue{pt("(%d%c(%d%c%d))%c%d\n")} tct(n2,n3,sym2);tct(total,n4,sym3);tct(n1,total,sym1); isSct(sym3,sym2)isTrue{pt("%d%c((%d%c%d)%c%d)\n")} tct(n3,n4,sym3);tct(n2,total,sym2);tct(n1,total,sym1); isSct(sym1,sym2)isSct(sym3,sym2) isTrue{pt("%d%c(%d%c(%d%c%d))\n")} tct(n1,n2,sym1);tct(total,total2,sym2); isTrue{pt("(%d%c%d)%c(%d%c%d)\n")} } } printf("Total=%d\t",SearchCount);return 0;}

评论