中午在公司吃飯,發現好多人在會議室討論一道數學題,聽著很有意思,作為數學控當然不能錯過這樣的機會,原來是同事拿著娃的小學題來找大家求助,題目是這樣的:“試卷有甲乙丙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