当程序员面对小学数学题

  中午在公司吃饭,发现好多人在会议室讨论一道数学题,听着很有意思,作为数学控当然不能错过这样的机会,原来是同事拿着娃的小学题来找大家求助,题目是这样的:“试卷有甲乙丙3类题,甲类题共6道,每题4分,乙类题共8道,每题5分,丙类题共8道,每题7分,问分数有多少种可能。答对有分,答错或不答0分”。读者不妨也思考一下

 

 

 

  先说程序员的解法

  从面向过程的角度思考,3个for循环,把所有分数遍历一遍,再用一张hash表统计一下无重复的结果就行了,20行代码差不多就搞定了,代码我是不忍心贴了。5分钟后各种版本的答案就出来了,有人说113,有人说116,还有人说165的....于是大家又开始互相对照程序找bug,真是一群好员工啊。

  再提供一个haskell的一行代码解法:

     length $ Data.List.nub [(a+b+c) | a<-[0,4..24], b<-[0,5..40], c<-[0,7..56]],哈哈,其实我是来黑java的。

  程序给出的答案是113,反推一下小学生应该怎么解这道题,我的思路是,4,5,7这三个数是出题人特意设计的,4和5的差是1,5和7的差是2,假设任意一个分数值x,可以通过少做一道4分题,多做一道5分题来得到x+1分,或者通过少做一道5分题,多做一道7分题来得到x+2分等等,从x-4到x+4的任意分数都是可行的。除了几个不可能分数之外,这几个数字应该可以组合出从0到总分的任意分数。然后再来讨论不可能分数都有哪些,总分是120分,直觉是越靠近60分不可能分数出现的可能越低,于是从0开始往上找,发现1,2,3,6这四个分数是不可能的,再往上试了几个分数都可以,估计直到60就没有不可能分数了,然后对称一下,同理可得119,118,117,114也是不可能分数,所以答案是113

posted @ 2016-03-23 09:32  汉泽的家  阅读(685)  评论(1编辑  收藏  举报