鱼C论坛

 找回密码
 立即注册
查看: 6007|回复: 8

[技术交流] python小练习(027):计算时钟上时针走一圈有多少次与分针重叠

[复制链接]
发表于 2016-11-28 21:04:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python小练习(026)用python求解喝汽水问题,传送门

今天的小练习我们来计算一下时钟上时针走一圈(12小时),有多少次与分针重叠,重叠时分别是几点几分几秒?(精确到+/-1秒)
注:时钟为机械式时针,时针和分针会缓慢随秒针的走动而走动。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-28 21:34:14 | 显示全部楼层
预留2楼,再附送一个LCD小时钟

有树莓派的鱼油,可以直接做成LCD小台钟哦。

无标题.png

  1. import time
  2. import os

  3. lcd={0:[' _  ','| | ','|_| '],\
  4.      1:['    ','  | ','  | '],\
  5.      2:[' _  ',' _| ','|_  '],\
  6.      3:[' _  ',' _| ',' _| '],\
  7.      4:['    ','|_| ','  | '],\
  8.      5:[' _  ','|_  ',' _| '],\
  9.      6:[' _  ','|_  ','|_| '],\
  10.      7:[' _  ','  | ','  | '],\
  11.      8:[' _  ','|_| ','|_| '],\
  12.      9:[' _  ','|_| ',' _| ']}

  13. def number2lcd(n):
  14.     global lcd
  15.     output = ['','','']
  16.     l = len(str(n))
  17.     while True:
  18.         i = n // 10**(l-1)
  19.         for j in range(3):
  20.             output[j] += lcd[i][j]
  21.         n = n % 10**(l-1)
  22.         l -= 1
  23.         if l == 0:
  24.             break
  25.     return output

  26. def clock():
  27.     t = time.localtime()
  28.     hour = number2lcd(t.tm_hour)
  29.     minute = number2lcd(t.tm_min)
  30.     second = number2lcd(t.tm_sec)
  31.     output = [hour[0]+' '+minute[0]+' '+second[0],hour[1]+'.'+minute[1]+'.'+second[1],hour[2]+'.'+minute[2]+'.'+second[2]]
  32.     return output

  33. while True:
  34.     o = os.system('cls')
  35.     for each in clock():
  36.         print (each)
  37.     time.sleep(1)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-28 22:13:03 | 显示全部楼层
本帖最后由 冬雪雪冬 于 2016-11-28 22:14 编辑

题目很简单,但调试花了很长的时间,主要是偏差值的确定,1e-3会多出许多临近的值,1e-4则又丢掉一些需要的值。
  1. s = 43200
  2. count = 0
  3. temp = ''
  4. for i in range(s):
  5.     h = i / s
  6.     m = (i / 3600) % 1
  7.     if abs(h - m ) < 1.2e-4:
  8.         count += 1
  9.         print('%2d:%02d:%02d'%(i / 3600, (i / 60) % 60, i % 60))
  10. print('共计%d次时针与分针重叠'%count)
复制代码

  1.   0:00:00
  2. 1:05:27
  3. 2:10:55
  4. 3:16:22
  5. 4:21:49
  6. 5:27:16
  7. 6:32:44
  8. 7:38:11
  9. 8:43:38
  10. 9:49:05
  11. 10:54:33
  12. 共计11次时针与分针重叠
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-28 22:24:48 | 显示全部楼层
高手在民间
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-28 22:30:47 | 显示全部楼层
冬雪雪冬 发表于 2016-11-28 22:13
题目很简单,但调试花了很长的时间,主要是偏差值的确定,1e-3会多出许多临近的值,1e-4则又丢掉一些需要的 ...

完全正确
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-28 22:43:04 | 显示全部楼层
版主大大的代码比我的简洁,我的也贴一下吧。
  1. #coding:utf-8
  2. '''
  3. 计算时钟上时针走一圈(12小时),有多少次与分针重叠,重叠时分别是几点几分几秒?
  4. 注:时钟为机械式时针,时针和分针会缓慢随秒针的走动而走动
  5. '''

  6. class clocks:
  7.     def __init__(self):
  8.         self.hour = 0
  9.         self.minute = 0
  10.         self.second = 0
  11.         self.h_ang = 0
  12.         self.m_ang = 0
  13.     def calc(self):
  14.         self.h_ang = self.hour*30+self.minute*30/60+self.second/60*(30/60)
  15.         self.m_ang = self.minute*360/60+self.second*(360/60)/60
  16.     def run(self):
  17.         self.second += 1
  18.         self.minute += self.second // 60
  19.         self.second %= 60
  20.         self.hour += self.minute // 60
  21.         self.minute %= 60
  22. flag = 1
  23. count = 0
  24. clock = clocks()
  25. while clock.hour < 12:
  26.     clock.calc()
  27.     if flag == 0:
  28.         if 0 < clock.h_ang - clock.m_ang < 0.1:
  29.             flag = 1
  30.         else:
  31.             flag = 0
  32.     else:
  33.         count += 1
  34.         print ('%d时%d分%d秒,时针与分针重叠' % (clock.hour,clock.minute,clock.second))
  35.         flag = 0
  36.     clock.run()
  37. print ('时针与分针总共重合了%d次' % count)
复制代码

输出:
0时0分0秒,时针与分针重叠
1时5分28秒,时针与分针重叠
2时10分55秒,时针与分针重叠
3时16分22秒,时针与分针重叠
4时21分49秒,时针与分针重叠
5时27分17秒,时针与分针重叠
6时32分44秒,时针与分针重叠
7时38分11秒,时针与分针重叠
8时43分39秒,时针与分针重叠
9时49分6秒,时针与分针重叠
10时54分33秒,时针与分针重叠
时针与分针总共重合了11次
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-28 22:59:20 | 显示全部楼层
我也写个LCD时钟。
  1. import time
  2. import os
  3. font =""" _     _  _     _  _  _  _  _   
  4. | |  | _| _||_||_ |_   ||_||_| .
  5. |_|  ||_  _|  | _||_|  ||_| _| . """

  6. while True:
  7.     t = time.localtime()
  8.     t_str = '%02d:%02d:%02d'%(t[3], t[4], t[5])
  9.     os.system('cls')
  10.     for line in range(3):
  11.         for n in t_str:
  12.             if n == ':':
  13.                 n = 10
  14.             print(font[34 * line + int(n) * 3: 34 * line + int(n) * 3 + 3], end = '')
  15.         print()
  16.     time.sleep(1)
复制代码


捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-23 17:17:54 | 显示全部楼层
本帖最后由 余欲渔 于 2017-2-23 17:19 编辑

分钟12圈,时钟1圈,所以肯定是11次相遇,然后直接佣秒钟来算结果,最后在秒位上+0.5以四舍五入
  1. for i in range(11):
  2.     print('%d时%d分%d秒'%(((3927.27*i)//3600),((3927.27*i)%3600)//60,(3927.27*i+0.5)%60))
复制代码

  1. = RESTART: C:/Users/ASUS/AppData/Local/Programs/Python/Python35-32/时钟分钟相遇.py =
  2. 0时0分0秒
  3. 1时5分27秒
  4. 2时10分55秒
  5. 3时16分22秒
  6. 4时21分49秒
  7. 5时27分16秒
  8. 6时32分44秒
  9. 7时38分11秒
  10. 8时43分38秒
  11. 9时49分5秒
  12. 10时54分33秒
  13. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-23 18:44:19 | 显示全部楼层
上面是用秒算的,似乎用分钟算更简单
  1. for i in range(11):
  2.     print('%d时%d分%d秒'%(i,60*i/11,(60*i/11%1)*60+0.5))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 13:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表