Friday, February 03, 2006
時鐘追趕問題
對於python可以運用在教學情境裡,可以用一個很有趣的例子,來作這方面的應用,「時鐘追趕問題」:如果時間在二點到三點鐘之間,分針與時針什麼時候重合?
「重合」表示2針會成為一直線,這代表會有2次重疊的時刻,一次是短針和長針同方向重合在一起,另一次則是2針反方向而成為一直線的狀態。
現在想要更一般性地來表示這個問題,如果時刻是在h時m分的時候,請問短針、長針重合的時刻為何?
我們將證明,如果時間為h時m分,和時間為h時整點,其重合的時間是一致的。
證明:假設x為重合的時間,ExtraTime為額外需要的時間,如果題目是要2針夾角成Theta度,則換算成為Theta/6分;因為分針的速度為時針的12倍,所以下列式子A成立。
x-m=t t=t/12+ExtraTime+(5h+m/12)-m <=== 式子A x=(60h+12*ExtraTime)/11
ExtraTime為0的表示同方向重合,為30則表示反方向重合的狀態,剛好與時針在整點時,所算出的結果是一致的。
import sys
from optparse import OptionParser
from math import modf
def SynClockTime(*args):
Hour, Min=args
MinAngle, HourAngle=Min*6, Hour*30+Min/2.
if HourAngle>MinAngle: #MinAngle over the HourAngle
for ExtraMin in (30, 60):
AlignMin=(60*Hour+ExtraMin*12)/11.
Sec, Min=modf(AlignMin)
Sec, Min=Sec*60, int(Min)
if Min<60: Min%=60; Hour+=1
print 'The next alignment is= %(Hour)s:%(Min)s:%(Sec)s'%vars()
else:
for ExtraMin in (0, 30):
AlignMin=(60*Hour+ExtraMin*12)/11.
Sec, Min=modf(AlignMin)
Sec, Min=Sec*60, int(Min)
if Min>60: Min%=60; Hour+=1
print 'The next alignment is= %(Hour)s:%(Min)s:%(Sec)s'%vars()
if __name__=='__main__':
usage='%prog [option]'
parser=OptionParser(usage=usage,version='%prog, Reversion 0.1')
parser.add_option('-T','--Time',nargs=2,type='int',help='-T Hour(24-format) Min')
options,args=parser.parse_args()
if len(sys.argv)==1:parser.print_help();raise SystemExit
if options.Time: SynClockTime(*options.Time)
程式碼分為2個情形,如果時針所走的角度比較大,則在同一整點時刻,會有2次重合的時間,如果分針所走的角度較大,則在同一整點及下一整點時刻,分別都有一次的重合時刻。
這個問題,可以幫我們理解,如何用python來表示,追趕問題中所需的數學式子。
延伸問題:
是否可以算至重合時間精確到秒?亦即為找出"hour時min分sec秒",2針重合。