痛恨,当时这道题没有做出来,没有安下心认真分析。当时作出了第二道题,迷宫问题,因为以前见过类似的(具体缺乏锻炼,调试了老半天)。
题目如下:
-----------------------------------
Description
Input
Output
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的。也就是如果有些变量名可以短的话尽量短。