2010顶嵌杯第一题--24点运算

来源:互联网 发布:香港国际网络电视台 编辑:程序博客网 时间:2024/05/18 10:41

痛恨,当时这道题没有做出来,没有安下心认真分析。当时作出了第二道题,迷宫问题,因为以前见过类似的(具体缺乏锻炼,调试了老半天)。

题目如下:

-----------------------------------

快算24

Description

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

Input

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

Output

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

Sample Input
5 5 1 5

Sample Output
5*(5-(1/5))

---------------------------------------

认真分析,不改变位置顺序,当时被这个搞死了。但是后来发现这是个很好的限制条件,其实是简单了,而不是复杂了。

 

分析如下:

1)五种操作顺序

给定4个正整数,a b c d .他们的操作顺序共有六种A(3,1)
//1((a b) c) d
 //2(a b) (c d)

//3(a (b c)) d

//4a ((b c) d)

//5a  (b  (c d))

 //*6**(a b) (c d)  第六种和第二种其实同样的,不管是先算前两个 还是先算后两个 结果是一样的。
2)每个操作中都含有4中操作运算(+、-、*、/)

根据这个思想写的伪代码:

每中操作类型 根据 所操作的间隔顺序不同,传递进不同的参数

 

可以将MathChoice抽象出来,它包含4中操作运算。

根据i值不同调用不同的函数。(这里宏定义也遇到过问题,原来把操作的值返回如return  add(a,b); 因为宏定义不能返回值,

所以改了,设了一个全局变量  static float tempSum=0;来记录各个操作后的结果)

 

间隔的顺序是1,2,3

#define interBefore(a) a-1  //当前间隔的前一个数
#define interAfter(a) a  //当前间隔后一个数

 

3)输出 封装

因为各个操作类型都定义好了,而每个操作类型的()的位置是可以定的,变的只是操作符的类型.

因此需要记录每个间隔的操作符类型。在得到正确结果的时候将当前的操作符记录下来。+ - * / 

 

以下是具体的源代码:

 删除了伪代码注释 ,排名又往前靠了,看来代码的大小也很影响ranklist的。也就是如果有些变量名可以短的话尽量短。

原创粉丝点击