陈太阳与算式
思路:
枚举所有填的符号的情况,并计算等式的结果。输出其中绝对值最小的即可。注意特判除以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