描述
给定4个不大于10的正整数(范围1-10),要求在不改变数据先后顺序的情况下,采用加减乘除四种运算,找到一个表达式,使得最后的结果是24.
输入
本题有多组输入数据,每组数据输入4个不大于10的正整数。输入数据保证有解。
输出
不改变数字的位置顺序,输出由’+’,’-‘,’*’,’/‘4个运算符和’(‘,’)’组成的表达式
样例输入
5 5 1 5
样例输出
5*(5-(1/5))
提示
本题的输出格式请依次按照以下5种形式逐一判断,并输出结果:
(1) (AoB)o(CoD)
(2) ((AoB)oC)oD
(3) (Ao(BoC))oD
(4) Ao((BoC)oD)
(5) Ao(Bo(CoD))
思路
我们学校oj只需输出一个答案即可,按照所给提示的顺序,因为24点可以通过分数的形式进行运算,所以令a、b、c、d为double类型,函数caculate1按照题目所给提示进行枚举
code
#include<iostream>
#include<cmath>
#include<cmath>
#define eps 1e-4
using namespace std;
void search(double a,double b,double c,double d);
int caculate1(double a,double b,double c,double d,int i,int j,int k);
double caculate2(double a,int i,double b);
char symbol[5]={'+','-','*','/'};
int main(){
double a,b,c,d;
while(cin>>a>>b>>c>>d){
search(a,b,c,d);
}
return 0;
}
void search(double a,double b,double c,double d){
int i,j,k,result;
for( i=0;i<4;i++){
for( j=0;j<4;j++){
for( k=0;k<4;k++){
result=caculate1(a,b,c,d,i,j,k);
if(result) return;
}
}
}
}
int caculate1(double a,double b,double c,double d,int i,int j,int k){
int ans=0;
//1
if(fabs(caculate2(caculate2(a,i,b),j,caculate2(c,k,d))-24)<eps) {
printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)\n",a,symbol[i],b,symbol[j],c,symbol[k],d);
ans=1;
return ans;
}
//2
if(fabs(caculate2(caculate2(caculate2(a,i,b),j,c),k,d)-24)<eps){
printf("((%.0lf%c%.0lf)%c%.0lf)%c%.0lf\n",a,symbol[i],b,symbol[j],c,symbol[k],d);
ans=1;
return ans;
}
//3
if(fabs(caculate2(caculate2(a,i,caculate2(b,j,c)),k,d)-24)<eps){
printf("(%.0lf%c(%.0lf%c%.0lf))%c%.0lf\n",a,symbol[i],b,symbol[j],c,symbol[k],d);
ans=1;
return ans;
}
//4
if(fabs(caculate2(a,i,caculate2(caculate2(b,j,c),k,d))-24)<eps){
printf("%.0lf%c((%.0lf%c%.0lf)%c%.0lf)\n",a,symbol[i],b,symbol[j],c,symbol[k],d);
ans=1;
return ans;
}
//5
if(fabs(caculate2(a,i,caculate2(b,j,caculate2(c,k,d)))-24)<eps){
printf("%.0lf%c(%.0lf%c(%.0lf%c%.0lf))\n",a,symbol[i],b,symbol[j],c,symbol[k],d);
ans=1;
return ans;
}
return ans;
}
double caculate2(double a,int i,double b){
switch(symbol[i]){
case '+':return (a+b);break;
case '-':return (a-b);break;
case '*':
return (a*b);break;
case '/': return (a/b);break;
}
}