• 当程序员面对小学数学题

    2016/03/23 可健康了 26 评论

中午同事拿着娃的小学题来找大家求助,题目是这样的:“试卷有甲乙丙3类题,甲类题共6道,每题4分,乙类题共8道,每题5分,丙类题共8道,每题7分,问分数有多少种可能。答对有分,答错或不答0分”。

思考一下……

先说程序员的解法

从java的角度思考,3个for循环,把所有分数遍历一遍,再用一张hash表统计一下无重复的结果就行了,20行代码差不多就搞定了,代码我是不忍心贴了。

再提供一个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。

8 8 收藏


直接登录
最新评论
  • gege5 游戏编程 2016/03/24

    你也是逗,这个题目给小学生做的,所以不要想得太复杂。

    如果正常思路发现很难,这个时候就不要去想怎么会这么难,而是要想,思路肯定是反常的。

    所以你发现一个一个加太复杂,就要反过来思考,从总分减。然后你会发现什么,你会发现减去的分数都是4、5、7的倍数。会做了没?

    至于程序算法,正反都行,我建议不要统计什么重复了,你搞个数组,全部为0,算一个就往对应位存,最后算数组有多少个元素大于零即可。

    • 可健康了 程序员 2016/03/24

      用程序算的话你说的没错,编程珠玑里就有这种解法。从总分减的想法有个问题,每类题的数量是一定的,不能单纯的去掉某个数的所有倍数,感觉还是像穷举

      • gege5 游戏编程 2016/03/24

        昨晚没看清楚,我以为是排列组合的题目了,其实这道题目,反过来也是一样的,我想,估计这个题目不是靠算的,是一个找规律的题目。

  • Joseph   2016/05/14

    能不能贴出java代码参考? 另外您是怎么确定不可能分数约靠近60约不可能? 正常的1.2.3.6是很容易想到,但不明白为什么可以推定这6以后就不会出现不可能分数。 直至114.117.118.119?

    • 可健康了 程序员 2016/05/16

      1、java代码随便写,就不贴了。

      2、不可能分数只是我的一个猜想,不会证明,感觉上越靠近中间的位置,数字排列组合的可能就越多,所以不可能分数分布越少,欢迎补充证明 : )

  • nanasaki   2016/05/14

    array_unique()

  • 一看懵了 再看就是不懂嘛

    “来个程序员”这是我答案

  • 黑猫警长 python web开发 2016/05/15

    来段python代码:

     

  • 苏颇曼   2016/05/20

    count=0;

    for(i=0;i<121;i++){

    if( (0==(i%7%5)) || (0==(i%7%4)) || (0==(i%5%4)) || (0==(i%7%5%4)) )

    count++;

    }

  • 这道题我的思路是先求出总分数4*6+5*8+7*8=24+40+56=120分,那么一半就是60分,所以只用求出60分以下的组合有多少种分就行了,因为总分120能得到x分就一定能得到120-x分,所以每一个分数都会有一个与60分对称的分数,所以把60分以下的总数乘以2再加上60分的1就可以了。

  • sagittar 工程师 2016/06/08

    直接蒙了。。

  • Yu_Hao 微信公众号: 一分钟的编程知识 2016/06/08

    Haskell的代码确实漂亮。 另外, 用 Data.Set 比用 nub 效率更高:

    length $ Data.Set.fromList [a + b + c | a<-[0,4..24], b<-[0,5..40], c<-[0,7..56]]

  • szc12000 php程序员 2016/06/20

    这其实是考最大公倍数的应用,三类题全答对是120分,而4,5,7的最大公倍数是140,所以组合中不可能出现,4,5,7之间重复的问题,看甲类题的可能结果是0到6,将甲类题从0开始依次代入,看5跟7的最大公倍数是35,5是不能超过40的,所以在甲从0到6的时候,每次,5跟7会出现一次重复,总共出现7次,所以结果是120—7=113

  • st8ack   2016/07/05

    #python

    a = range(25)[0:25:4]
    b = range(41)[0:41:5]
    c = range(57)[0:57:7]
    alist = []
    for x in a:
    for y in b:
    for z in c:
    alist.append(x+y+z)
    print set(alist)
    print len(set(alist))

    不可能得分 1,2,3,6(用120减去这些数)

    对应的119,118,117,114 也是不可能得到的分数

    0到120一共121种可能 减去前面的到的8种不可能分数就是113

     

  • 你也是逗,明明是要问总分有几种情况,你列这几百种有个蛋用

  • 你最后的想法是对的,但你没有思考下去

  •  

  • 逗比   01/10

    除了1,2,3得不到其他都可以得到,所以答案是

  • 逗比   01/10

    不好意思,逗比了