看到一个很有意思的话题——一天(24小时)内,时针和分针重合的次数。如果只是想知道结果,最直接的办法可能就是比划一下,然后很快就能够知道答案。但是如果是要用算法代码来完成的话就不再那么直接简单了。
首先想想时针分针存在什么样的关系,当分针转动一圈时针转1/60圈。相同时间x(分)内,分针会转动s1=x/60圈,时针则会转动s2=x/(60*12)圈,那么他们重合即为两者转动的圈数的小数部分是相等的。由此可知 s1-(int)s1 = s2 - (int)s2 。然后可以得出如下代码:
但是输出的结果却是 count=3,分析一下,按照上面的方法只能得到在整数分钟上的重合次数,这并不是我们想要的结果,按照常识,分针时针重合很多都不是发生在整数分钟上的,那么可以把我们的循环间隔的1改得足够小,那样可能会得到正确结果,但是足够小是多小呢,这个无从得知,而且重合的位置可能是一个无限小数,那么我们可以换一种方式。
既然不能直接通过相等判断,那么我们可以判断 上一次 的分针的偏移位置在时针前面 和 下一次分针的偏移位置在时针的后面 ,以此来确定在这个过程中分针和时针发生了重合,得到以下代码:
得到输出结果 count=20
这个也不是想要的结果,仔细查看代码,发现代码里面只是比较了整数分钟之间是否存在重合,忽略了整数分钟上发生的重合。于是多加一个判断判断便可以了:
最后输出结果 count=23
后面发现,循环的间隔不需要是每分钟,因为每次重合分针转动都超过了一圈,那么每个重合点在表盘上都会是大于5/60的距离,故可以使用5分钟的间隔进行循环:
结果:count=23。
综合,其中计算重合次数包括了开始的00:00和最后的24:00两个时间点。
最开始只是想知道一个结果,到底24小时时针和分针可以重合多少次,到最后的一段代码实现,整个过程其实是十分有意思的,也许并不是因为一个问题得到解决,更重要的可能是过程中的学习和思考。