快算24
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4646 | Accepted: 2851 |
Description
给定4个不大于10的正整数(范围1-10),要求在不改变数据先后顺序的情况下,采用加减乘除四种运算,找到一个表达式,使得最后的结果是24。
Input
4个不大于10的正整数。输入数据保证存在唯一解。
Output
不改变位置顺序,由'+','-','*','/'4个运算符和'(',')'组成的表达式
Sample Input
5 5 1 5
Sample Output
5*(5-(1/5))
关于这个题,说说自己的想法,乍一看比较麻烦,但是以现在我学的知识来做确实比较麻烦,不说别的就是说加括号的方式也就是运算的先后顺序就有5种,要写5个if语句,当时很庆幸只有4个数字。。。。。。。。我直接计算的,注释都在程序里,大家可以看一下
#include "stdio.h"
#include "string.h"
void xunzhao(double a,double b,double c,double d);
int jisuan1(double a,double b,double c,double d,int i,int j,int k);
double jisuan2(double a,int i,double b);
int main()
{ double a,b,c,d;//由题目可知两个整数相除是要取小数的,所以干脆都取double型
while(scanf("%lf%lf%lf%lf",&a,&b,&c,&d)!=EOF)
xunzhao(a,b,c,d);
return 0;
}
void xunzhao(double a,double b,double c,double d)
{ int i,j,k;
int result;
for(i=0;i<4;i++)//因为有四种运算,3个运算符,所以有3个循环,每个循环4种情况
for(j=0;j<4;j++)
for(k=0;k<4;k++)
{ result=jisuan1(a,b,c,d,i,j,k);
if(result)//题目说有唯一解所以找到后直接跳出来就了,进行下一次运算
break;
}
}
char ms[4]={'+','-','*','/'};//ms代表mathematical symbol运算符,需要将i,j,k转换成符号
int jisuan1(double a,double b,double c,double d,int i,int j,int k)
{ int p=0;
if(jisuan2(jisuan2(a,i,b),j,jisuan2(c,k,d))==24.000000)/*有5种计算方式可以涵盖,因为有唯一解,所以5个if语句并排就行了*/
{ printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)",a,ms[i],b,ms[j],c,ms[k],d);
p=1;
}
if(jisuan2(jisuan2(a,i,jisuan2(b,j,c)),k,d)==24.000000)
{ printf("(%.0lf%c(%.0lf%c%.0lf))%c%.0lf",a,ms[i],b,ms[j],c,ms[k],d);
p=1;
}
if(jisuan2(a,i,jisuan2(jisuan2(b,j,c),k,d))==24.000000)
{ printf("%.0lf%c((%.0lf%c%.0lf)%c%.0lf)",a,ms[i],b,ms[j],c,ms[k],d);
p=1;
}
if(jisuan2(jisuan2(jisuan2(a,i,b),j,c),k,d)==24.000000)
{ printf("((%.0lf%c%.0lf)%c%.0lf)%c%.0lf",a,ms[i],b,ms[j],c,ms[k],d);
p=1;
}
if(jisuan2(a,i,jisuan2(b,j,jisuan2(c,k,d)))==24.000000)
{ printf("%.0lf%c(%.0lf%c(%.0lf%c%.0lf))",a,ms[i],b,ms[j],c,ms[k],d);
p=1;
}
return p;
}
double jisuan2(double a,int i,double b)
{ switch(ms[i])
{
case '+':
return (a+b);break;
case '-':
return (a-b);break;
case '*':
return (a*b);break;
default:
return (a/b);
}
}