【C++每周一题】——2023.12.10

题目

给一个学生的分数(一到一百之间的整数),判断该分数的等级,分段方法如下:

[100, 90][89, 85][84, 80][79, 75][74, 70][69, 65][64, 60][59, 0]
ABCDEFGH

这又是一道很简单的题,直接if else嵌套即可。然而为了锻炼我们的思维,老师说不能使用if语句,只能使用switch语句


解题

众所周知,switch只能匹配固定数据,而这道题的数据足足有100种可能,而我难道就真的要写60个case(等级H直接用default就可以不用讨论了)吗?显然不是。

  1. 我最初的想法是先将数据通过四舍五入(可以不用if实现)将精确度模糊到十位,但是这样的话,A和B就都有一个相同的值90了,C&D,E&F等都一样。所以,这种方法只适用于边界值都为整十数时
  2. 虽然第一种方法失败了,但是,这也给了我启发:将所有输入数据除以五,根据运算的默认向下取整特性,边界值也就成了{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;
    }
    
    

总结

对比一下先后两种思路,直观的感受是第一种复杂一些,但第一种还是失败了。第二种思路简单一点,却能很容易的成功。这也映射到我自己身上,比如数学考试的压轴题,我总是不肯用寻常方式做,最后多半时候都做错了。虽然“条条大路通罗马”,算法异步能求同;但我们最好不要给自己找麻烦。有好的方法就用,是要有探索精神,但也不要太执着。要用简单的方法做复杂的事。
再说点与编程相关的:复杂的题目的解题思路无非就是化繁为简,向着大方向去思考,思路基本就对了。面对“普通的难题”思路反而是我们太复杂了,正解的思路往往都很巧妙。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值