热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

时针、分针和秒针是群快乐的好伙伴

最近发现自己好久没有研究过算法了,达尔文坚持进化论,而拉马克则提出“用尽废退”理论。在学术领域我还是比较赞同拉马克的观点。程序设计道理也是一样的
    最近发现自己好久没有研究过算法了,达尔文坚持进化论,而拉马克则提出“用尽废退”理论。在学术领域我还是比较赞同拉马克的观点。程序设计道理也是一样的,只有多看优秀的代码的,学习优雅的设计框架和思想,经过充分的思考并将其移花接木般应用在自己的程序里才是学习的本质。以前我们的高中老师管这个技能叫做“能力迁移”。
   曾经在哪儿看到过一道面试还是笔试题,具体及不太清楚了,当时没多想。这几天它突然从我脑子中迸了出来,就把它拿来给大家打打牙祭吧。具体是这样的:
   如下图所示,从下午15:00开始到晚上21:00整,时针和分钟一共重合了多少次?并给出它们相遇的时刻。

    第一问简单,肯定是6次这没什么可说的。关键是第二问,求出它们相遇的时刻。确切的说,这道题考查的是程序设计的童子功:数学分析和运算能力。因为我们知道计算机和数学是不分家的,很多问题看似很复杂,其实本质上还不就那么点事儿。就像以前高考时,每次模拟考试,我们班主任总是不忘记叮嘱大家,一定要站在命题人的角度出发,想想他想考你们什么,然后才能得心应手,他管这个过程叫“破题能力”。OK,又扯远了。既然这道题目出现在程序员面试课堂里,那我们就来探究一下它究竟想考什么。

    表盘共360度,一共分成60个刻度,所以每个刻度是6度,分针每转360度是1小时,时针才转30度。如下:

    假如说,时针和分针起始时所成夹角为c度(本题中c=90),时针和分针相遇时他们各自分别走过了x度和y度,我们可以很容易的得出一个二元一次方程组:

   解这个方程组,其实也是相当easy的,初中二年级水平就可以应付了。其中x=8.18,y=98.18。因为时针每走6度是10分钟,也就是说分针是在15:10分~15:20之间与时针重合的。为了计算粒度更精确一点,分针每1分钟会走过6度,所以相遇时分针共走了98.18/6=16.36分钟,取整之后就是16分。最后我们可以得到该问题的一般性结论:
   最后,该方程的解如表所下(单位:度):

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


   如果这道题继续问:当时针和分针相遇时,秒针能和它们相遇吗?如果能请说明原因,如果不能请给出此时秒针所指的时刻。既然原理都搞清楚了,那么再精确一点又何妨呢?不就多个条件而已嘛。同样的,秒针每转360度是1分钟,分针才转过6度,假如说重合的时刻秒针走过的度数为z,我们可以得到一个三元一次方程组:
    倘若一直用初中二年级的水平来解答,显得太没面子了,好歹咱也是学过线性代数的人,不能把大学功课全还给老师了。幸好我还记得一点:
    上述方程可以整理如下:
    不管你用高斯消元法还是其他,因为行列式里0比较多,所以我决定用克莱姆法则求解,最后,解向量的形式如下所示:

    其中:

    z求出来的结果最终要对360求余,结果如下表所示(单位:度):

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,呵呵。感兴趣的童鞋可以从fj.pngclock.zip下载源代码,我用qt写的。最后的验证结果如下:

 
    另外,如果这个题初始条件改成从中午12点到凌晨12点,上述公式里我们只要修改c的值就可以了,从0到360,步长是30,剩下的就是算术基本功的考查了。说白了这道题考查的知识点太基础了,就是看你细心不细心。如果是面试或笔试题,由于临场环境,就在大家都找到方法的前提,考的就是你的细心认真程度。
  最后,我承认自己是个马大哈子,哈哈…


转:https://www.cnblogs.com/masterpanda/p/5700458.html



推荐阅读
  • 汇编语言标识符和表达式(四)(表达式与符号定义语句)
    7、表达式表达式是程序设计课程里的一个重要的基本概念,它可由运算符、操作符、括号、常量和一些符号连在一起的式子。在汇编语言中,表达式分为:数值表达式和地址表达式。(1)进制伪指令R ... [详细]
  • 如何寻找程序员的兼职机会
    随着远程工作的兴起,越来越多的程序员开始寻找灵活的兼职工作机会。本文将介绍几个适合程序员、设计师、翻译等专业人士的在线平台,帮助他们找到合适的兼职项目。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • ACM经典书籍推荐
    本文介绍了几本在算法和计算机科学领域具有重要影响力的书籍,包括由Donald E. Knuth编著的《计算机程序设计艺术》第一卷,以及潘氏兄弟的数论经典教材等。这些书籍不仅是学习相关领域的宝贵资源,也是专业人士不可或缺的参考书。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 本文探讨了在AspNetForums平台中实施基于角色的权限控制系统的方法,旨在为不同级别的用户提供合适的访问权限,确保系统的安全性和可用性。 ... [详细]
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 本文探讨了线性表中元素的删除方法,包括顺序表和链表的不同实现策略,以及这些策略在实际应用中的性能分析。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
author-avatar
禁令2502861143
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有