曾经在哪儿看到过一道面试还是笔试题,具体及不太清楚了,当时没多想。这几天它突然从我脑子中迸了出来,就把它拿来给大家打打牙祭吧。具体是这样的:
如下图所示,从下午15:00开始到晚上21:00整,时针和分钟一共重合了多少次?并给出它们相遇的时刻。
第一问简单,肯定是6次这没什么可说的。关键是第二问,求出它们相遇的时刻。确切的说,这道题考查的是程序设计的童子功:数学分析和运算能力。因为我们知道计算机和数学是不分家的,很多问题看似很复杂,其实本质上还不就那么点事儿。就像以前高考时,每次模拟考试,我们班主任总是不忘记叮嘱大家,一定要站在命题人的角度出发,想想他想考你们什么,然后才能得心应手,他管这个过程叫“破题能力”。OK,又扯远了。既然这道题目出现在程序员面试课堂里,那我们就来探究一下它究竟想考什么。
表盘共360度,一共分成60个刻度,所以每个刻度是6度,分针每转360度是1小时,时针才转30度。如下: 假如说,时针和分针起始时所成夹角为c度(本题中c=90),时针和分针相遇时他们各自分别走过了x度和y度,我们可以很容易的得出一个二元一次方程组:
c | 90 | 120 | 150 | 180 | 210 | 240 |
x | 8.18 | 10.91 | 13.64 | 16.37 | 19.09 | 21.82 |
y | 98.18 | 130.91 | 163.64 | 196.37 | 229.09 | 261.82 |
具体时刻 | 15:16 | 16:21 | 17:27 | 18:32 | 19:38 | 20:43 |
其中:
c | 90 | 120 | 150 | 180 | 210 | 240 |
x=c/11 | 8.18 | 10.91 | 13.64 | 16.36 | 19.09 | 21.82 |
y=12c/11 | 98.18 | 130.91 | 163.64 | 196.36 | 229.09 | 261.82 |
z=720c/11 | 129.6 | 294.5 | 100.8 | 259.2 | 64.8 | 230.4 |
具体时刻 | 15:16:21 | 16:21:49 | 17:27:16 | 18:32:43 | 19:38:10 | 20:43:38 |
当我想对这个结果进行验证时,被windows自带的时针着实给坑了一把。正常情况下,应该是秒针每走60度,分针就走1度;分针每走12度,时针就走1度。可它偏偏没这么设计,网上苦苦搜寻无果之后,哥们打算自己严格按照“国际标准”来自己写个带表盘的时钟,代码有些烂,不敢保证完全没有BUG,呵呵。感兴趣的童鞋可以从clock.zip下载源代码,我用qt写的。最后的验证结果如下:
最后,我承认自己是个马大哈子,哈哈…