POJ 3983 快算24 表达式模拟非常好的一个题

快算24
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 3445   Accepted: 2065

Description

给定4个不大于10的正整数(范围1-10),要求在不改变数据先后顺序的情况下,采用加减乘除四种运算,找到一个表达式,使得最后的结果是24。

Input

4个不大于10的正整数。输入数据保证存在唯一解。

Output

不改变位置顺序,由'+','-','*','/'4个运算符和'(',')'组成的表达式

Sample Input

5 5 1 5

Sample Output

5*(5-(1/5))


#include<stdio.h>
double a,b,c,d;
double cal(double n1,int op,double n2)
{
//	printf("dd");
	if(op==1)      return n1+n2;
	else if(op==2) return n1-n2;
	else if(op==3) return n1*n2;
	else if(op==4) return n1/n2;
}

int can(int op1,int op2,int op3,int m)
{
	double ans=0.0;
	//printf("kao");
	  if(m==1)
	      ans=cal(cal(a,op1,b),op2,cal(c,op3,d));//a,b计算后 cd也计算后 二者结果再计算
	  else if(m==2)
		  ans=cal(cal(cal(a,op1,b),op2,c),op3,d);
	  else if(m==3)
		  ans=cal(cal(a,op1,cal(b,op2,c)),op3,d);
	  else if(m==4)
		  ans=cal(a,op1,cal(cal(b,op2,c),op3,d));
	  else //if(m==5)
		  ans=cal(a,op1,cal(b,op2,cal(c,op3,d)));
	  if(ans==24.0) return 1;
	  return 0;
}
char get(int op)
{
	if(op==1) return '+';
	else if(op==2) return '-';
	else if(op==3) return '*';
	else return '/';
}
void print(int op11,int op22,int op33,int m)
{
	char op1,op2,op3;
       op1=get(op11);
	   op2=get(op22);
	   op3=get(op33);
	   if(m==1) printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)\n",a,op1,b,op2,c,op3,d);
	   else if(m==2) printf("((%.0lf%c%.0lf)%c%.0lf)%c%.0lf\n",a,op1,b,op2,c,op3,d);
	   else if(m==3) printf("(%.0lf%c(%.0lf%c%.0lf))%c%.0lf\n",a,op1,b,op2,c,op3,d);
	   else if(m==4) printf("%.0lf%c((%.0lf%c%.0lf)%c%.0lf)\n",a,op1,b,op2,c,op3,d);
	   else printf("%.0lf%c(%.0lf%c(%.0lf%c%.0lf))\n",a,op1,b,op2,c,op3,d);
}
int main()
{
	int flag,i,j,k,m;
	while(scanf("%lf %lf %lf %lf",&a,&b,&c,&d)!=EOF)
	{
		flag=1;
		for(i=1;i<=4&&flag;i++)//暴力4个数字之间的符号
			for(j=1;j<=4&&flag;j++)
				for(k=1;k<=4&&flag;k++)
                   for(m=1;m<=5&&flag;m++)//暴力括号的所有情况 因为4个数 顶多有5中计算顺序 所以是5
				   {
					if(can(i,j,k,m))
					{
						print(i,j,k,m);
						flag=0;
					}
				   }
	}
	return 0;
}


阅读更多

更多精彩内容