超重宏做法
#include<algorithm>
#include<cstdio>
#include<cstdlib>
struct Val{
int val;
Val(int val=0):val(val){}
void eval(){}
};
template<typename L,typename R>struct Expr{
L l;
R r;
char op;
int val;
Expr(L l,char op,R r):l(l),op(op),r(r){
if(op=='+')val=l.val+r.val;
if(op=='-')val=l.val-r.val;
if(op=='*')val=l.val*r.val;
if(op=='/')val=l.val/r.val;
}
void eval(){
l.eval();
r.eval();
if(op=='+'||op=='*')
printf("%d%c%d=%d\n",std::max(l.val,r.val),op,std::min(l.val,r.val),val);
else
printf("%d%c%d=%d\n",l.val,op,r.val,val);
}
};
template<typename L,typename R>
Expr<L,R>make_Expr(L l,char op,R r){
return Expr<L,R>(l,op,r);
}
template<typename T>
void f(T x){
if(x.val==24){
x.eval();
exit(0);
}
}
template<typename A,typename B>
void f(A a,B b){
#define L(op,a,b)f(make_Expr(a,op,b));
#define K(a,b)\
L('+',a,b)\
if(a.val>b.val)\
L('-',a,b)\
L('*',a,b)\
if(b.val&&a.val%b.val==0)\
L('/',a,b)
#define J(a,b)K(a,b)K(b,a)
J(a,b)
}
template<typename A,typename B,typename C>
void f(A a,B b,C c){
#define I(op,a,b,c)f(make_Expr(a,op,b),c);
#define H(a,b,c)\
I('+',a,b,c)\
if(a.val>b.val)\
I('-',a,b,c)\
I('*',a,b,c)\
if(b.val&&a.val%b.val==0)\
I('/',a,b,c)
#define E(a,b,c)H(a,b,c)H(a,c,b)
#define D(a,b,c)E(a,b,c)E(b,a,c)E(c,a,b)
D(a,b,c)
}
void f(int a,int b,int c,int d){
#define G(op,a,b,c,d)f(make_Expr(Val(a),op,Val(b)),Val(c),Val(d));
#define F(a,b,c,d)\
G('+',a,b,c,d)\
if(a>b)\
G('-',a,b,c,d)\
G('*',a,b,c,d)\
if(b&&a%b==0)\
G('/',a,b,c,d)
#define C(a,b,c,d)F(a,b,c,d)F(a,b,d,c)
#define B(a,b,c,d)C(a,b,c,d)C(a,c,b,d)C(a,d,b,c)
#define A(a,b,c,d)B(a,b,c,d)B(b,a,c,d)B(c,a,b,d)B(d,a,b,c)
A(a,b,c,d);
}
int main(){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
f(a,b,c,d);
printf("No answer!");
return 0;
}
以及真正的超重宏(洛谷似乎过不了编译)
#include<algorithm>
#include<cstdio>
#include<cstdlib>
struct Val{
int val;
Val(int val_=0){val=val_;}
void eval(){}
};
template<typename L,typename R>struct Expr{
L l;
R r;
char op;
int val;
Expr(){}
Expr(L l_,char op_,R r_){
l=l_;
op=op_;
r=r_;
if(op=='+')val=l.val+r.val;
if(op=='-')val=l.val-r.val;
if(op=='*')val=l.val*r.val;
if(op=='/')val=l.val/r.val;
}
void eval(){
l.eval();
r.eval();
if(op=='+'||op=='*')
printf("%d%c%d=%d\n",std::max(l.val,r.val),op,std::min(l.val,r.val),val);
else
printf("%d%c%d=%d\n",l.val,op,r.val,val);
}
};
template<typename L,typename R>
Expr<L,R>make_Expr(L l,char op,R r){return Expr<L,R>(l,op,r);}
int main(){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
#define f(x)if(x.val==24){x.eval();return 0;}
#define L(op,a,b)f(make_Expr(a,op,b))
#define K(a,b)\
L('+',a,b)\
if(a.val>b.val)\
L('-',a,b)\
L('*',a,b)\
if(b.val&&a.val%b.val==0)\
L('/',a,b)
#define J(a,b)K(a,b)K(b,a)
#define I(op,a,b,c)J(make_Expr(a,op,b),c)
#define H(a,b,c)\
I('+',a,b,c)\
if(a.val>b.val)\
I('-',a,b,c)\
I('*',a,b,c)\
if(b.val&&a.val%b.val==0)\
I('/',a,b,c)
#define E(a,b,c)H(a,b,c)H(a,c,b)
#define D(a,b,c)E(a,b,c)E(b,a,c)E(c,a,b)
#define G(op,a,b,c,d)D(make_Expr(Val(a),op,Val(b)),Val(c),Val(d))
#define F(a,b,c,d)\
G('+',a,b,c,d)\
if(a>b)\
G('-',a,b,c,d)\
G('*',a,b,c,d)\
if(b&&a%b==0)\
G('/',a,b,c,d)
#define C(a,b,c,d)F(a,b,c,d)F(a,b,d,c)
#define B(a,b,c,d)C(a,b,c,d)C(a,c,b,d)C(a,d,b,c)
#define A(a,b,c,d)B(a,b,c,d)B(b,a,c,d)B(c,a,b,d)B(d,a,b,c)
A(a,b,c,d);
printf("No answer!");
return 0;
}