陈太阳与算式

陈太阳与算式
陈太阳与算式

思路:

枚举所有填的符号的情况,并计算等式的结果。输出其中绝对值最小的即可。注意特判除以0的情况。
枚举可以使用搜索。计算等式结果时应注意乘除和加减的优先级问题。判断结果是否为整数可以使用fabs(x-round(x))<eps,其中eps可以设为1e-9。(注意强制转换int(x)或long long(x)并不是舍四进五,可能会有精度误差)

代码:

#include<bits/stdc++.h>
using namespace std;
long long ans=0x7f7f7f7f,a,b,c,d;
int main()
{
 scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
 if(a==0||b==0||c==0||d==0)
 {
  printf("0\n");
  return 0;
 }
 ans=min(ans,abs(a+b+c+d));
 ans=min(ans,abs(a+b+c-d));
 ans=min(ans,abs(a+b+c*d));
 if(c%d==0)ans=min(ans,abs(a+b+c/d));
 ans=min(ans,abs(a+b-c+d));
 ans=min(ans,abs(a+b-c-d));
 ans=min(ans,abs(a+b-c*d));
 if(c%d==0)ans=min(ans,abs(a+b-c/d));
 ans=min(ans,abs(a+b*c+d));
 ans=min(ans,abs(a+b*c-d));
 ans=min(ans,abs(a+b*c*d));
 if(b*c%d==0)ans=min(ans,abs(a+b*c/d));
 if(b%c==0)ans=min(ans,abs(a+b/c+d));
 if(b%c==0)ans=min(ans,abs(a+b/c-d));
 if(b*d%c==0)ans=min(ans,abs(a+b*d/c));
 if(b%(c*d)==0)ans=min(ans,abs(a+b/(c*d))); 
 ans=min(ans,abs(a-b+c+d));
 ans=min(ans,abs(a-b+c-d));
 ans=min(ans,abs(a-b+c*d));
 if(c%d==0)ans=min(ans,abs(a-b+c/d));
 ans=min(ans,abs(a-b-c+d));
 ans=min(ans,abs(a-b-c-d));
 ans=min(ans,abs(a-b-c*d));
 if(c%d==0)ans=min(ans,abs(a-b-c/d));
 ans=min(ans,abs(a-b*c+d));
 ans=min(ans,abs(a-b*c-d));
 ans=min(ans,abs(a-b*c*d));
 if(b*c%d==0)ans=min(ans,abs(a-b*c/d));
 if(b%c==0)ans=min(ans,abs(a-b/c+d));
 if(b%c==0)ans=min(ans,abs(a-b/c-d));
 if(b*d%c==0)ans=min(ans,abs(a-b*d/c));
 if(b%(c*d)==0)ans=min(ans,abs(a-b/(c*d)));
 ans=min(ans,abs(a*b+c+d));
 ans=min(ans,abs(a*b+c-d));
 ans=min(ans,abs(a*b+c*d));
 if(c%d==0)ans=min(ans,abs(a*b+c/d));
 ans=min(ans,abs(a*b-c+d));
 ans=min(ans,abs(a*b-c-d));
 ans=min(ans,abs(a*b-c*d));
 if(c%d==0)ans=min(ans,abs(a*b-c/d));
 ans=min(ans,abs(a*b*c+d));
 ans=min(ans,abs(a*b*c-d));
 ans=min(ans,abs(a*b*c*d));
 if(a*b*c%d==0)ans=min(ans,abs(a*b*c/d));
 if(a*b%c==0)ans=min(ans,abs(a*b/c+d));
 if(a*b%c==0)ans=min(ans,abs(a*b/c-d));
 if(a*b*d%c==0)ans=min(ans,abs(a*b*d/c));
 if(a*b%(c*d)==0)ans=min(ans,abs(a*b/(c*d)));
 if(a%b==0)ans=min(ans,abs(a/b+c+d));
 if(a%b==0)ans=min(ans,abs(a/b+c-d));
 if(a%b==0)ans=min(ans,abs(a/b+c*d));
 if(a%b==0)if(c%d==0)ans=min(ans,abs(a/b+c/d));
 if(a%b==0)ans=min(ans,abs(a/b-c+d));
 if(a%b==0)ans=min(ans,abs(a/b-c-d));
 if(a%b==0)ans=min(ans,abs(a/b-c*d));
 if(a%b==0)if(c%d==0)ans=min(ans,abs(a/b-c/d));
 if(a*c%b==0)ans=min(ans,abs(a*c/b+d));
 if(a*c%b==0)ans=min(ans,abs(a*c/b-d));
 if(a*c*d%b==0)ans=min(ans,abs(a*c*d/b));
 if(a*c%(b*d)==0)ans=min(ans,abs(a*c/(b*d)));
 if(a%(b*c)==0)ans=min(ans,abs(a/(b*c)+d));
 if(a%(b*c)==0)ans=min(ans,abs(a/(b*c)-d));
 if(a*d%(b*c)==0)ans=min(ans,abs(a*d/(b*c)));
 if(a%(b*c*d)==0)ans=min(ans,abs(a/(b*c*d)));
 printf("%lld\n",ans);
 return 0;
}

来源:zr