018-大笨钟
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。
下面就请你写个程序,根据当前时间替大笨钟敲钟。
输入格式:
输入第一行按照
hh:mm
的格式给出当前时间。其中hh
是小时,在00到23之间;mm
是分钟,在00到59之间。输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个
Dang
。如果不是敲钟期,则输出:Only hh:mm. Too early to Dang.
其中
hh:mm
是输入的时间。输入样例1:
19:05
输出样例1:
DangDangDangDangDangDangDangDang
输入样例2:
07:05
输出样例2:
Only 07:05. Too early to Dang.
这道题目的思路非常简单,在hh的数<12或者刚好是12:00的时候,不dang;其余时候若mm不为0,当hh+1下;若mm为0,当hh下。
思路确定之后我们再来看表达,这个表达显然是有一些地方值得注意的。
- hh、mm的形式都是按照钟表时间的形式,存在第一位为零的情况,这种时候怎么表示,怎么比较。
实验可得,直接将05看做5参与运算是不可行的,Python中又不接受以0开头的十进制整型数据,所以下面的尝试将报错。
#这是错的
h,m = map(int,input().split())
if 0 <= h < 12:
print(f'Only {h}:{m}. Too early to Dang.')
if h == 12 and m == 0:
print(f'Only {h}:{m}. Too early to Dang.')
- 这个时候我们想到我们需要输入的是hh:mm格式的数据,显然他和两个整型数据有区别,那不妨把它看作字符串,我们需要用到字符串的切片方法提取对应索引位置上的数字进行比较。
time[0]、time[2]、time[0:2]
这样我们可以有效的得到我们输入的每个数字,那怎么讲这些单个的数字进行比较呢 。
- 我们要明白,不加限制得到的输入都是以字符串形式呈现的,所以要想将字符串形式的数字转换成整型或者浮点型的格式,就需要加上int、float的限定,这里我们很快通过字符串的切片得到完整的hh和mm,值得注意的是,字符串的切片包左不包右,我们将切出来的hh和12比较,将切出来的mm和0进行比较,按照我们最开始的思路,这个题目就很简单啦。
Time=input()
A=int(Time[0:2])-12#判断后半天还是前半天
if int(Time[0:2])>12:
if int(Time[3:5])>0:
#分支嵌套,在需要dang的情况下如果mm再大于0,则多敲一下
print("Dang"*(A+1), end="")
#在需要dang的情况下如果mm不大于0,则直接敲hh比12多的次数
else:
print("Dang"*A, end="")
#如果大分支都不需要dang我们直接按格式输出
else:
print("Only %s. Too early to Dang."%(Time))
PTA篇 注:PTA代码其中很多是我很久之前学编程的时候做过的,可能借鉴了当时比较火的方法、资料或者身边人的思维,也有的题当时就注释了一些很基础的知识点,现在重新梳理我重新阅读了题目和代码,尽量跳出这个答案去想思路,试试错或者找到其他可行的方法,加入了一些更直接的注释方便大家理解。关于题目的分析是我一点点完善的,关于代码的借鉴已经难以找全出处。若有侵权,请联系我我将及时做出补救。