题目
给一个学生的分数(一到一百之间的整数),判断该分数的等级,分段方法如下:
[100, 90] [89, 85] [84, 80] [79, 75] [74, 70] [69, 65] [64, 60] [59, 0] A B C D E F G H
这又是一道很简单的题,直接if else
嵌套即可。然而为了锻炼我们的思维,老师说不能使用if
语句,只能使用switch
语句。
解题
众所周知,switch
只能匹配固定数据,而这道题的数据足足有100种可能,而我难道就真的要写60个case
(等级H直接用default
就可以不用讨论了)吗?显然不是。
- 我最初的想法是先将数据通过四舍五入(可以不用
if
实现)将精确度模糊到十位,但是这样的话,A和B就都有一个相同的值90
了,C&D,E&F等都一样。所以,这种方法只适用于边界值都为整十数时。 - 虽然第一种方法失败了,但是,这也给了我启发:将所有输入数据除以五,根据运算的默认向下取整特性,边界值也就成了{20, 19, 18, …, 12}!那就直接上代码:
# include <iostream> int x; char d; int main (){ scanf("%d", &x); x /= 5; switch (x){ case 20:case 19:case 18: d='A';break; case 17: d='B';break; case 16: d='C';break; case 15: d='D';break; case 14: d='E';break; case 13: d='F';break; case 12: d='G';break; default: d='H'; } printf("%c", d); return 0; }
总结
对比一下先后两种思路,直观的感受是第一种复杂一些,但第一种还是失败了。第二种思路简单一点,却能很容易的成功。这也映射到我自己身上,比如数学考试的压轴题,我总是不肯用寻常方式做,最后多半时候都做错了。虽然“条条大路通罗马”,算法异步能求同;但我们最好不要给自己找麻烦。有好的方法就用,是要有探索精神,但也不要太执着。要用简单的方法做复杂的事。
再说点与编程相关的:复杂的题目的解题思路无非就是化繁为简,向着大方向去思考,思路基本就对了。面对“普通的难题”思路反而是我们太复杂了,正解的思路往往都很巧妙。