特殊时间
【问题描述】
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
2022 年 2 月 22 日 22: 20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成,
如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个
0 组成。
小蓝对这样的时间很感兴趣, 他还找到了其它类似的例子, 比如 111 年 10 月 11 日 01: 11,,2202 年 2 月 22
日 22: 02 等等。
请问, 总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成 4 位后由 3 个一种数字和 1 个另一种数字组成。注意 1111 年 11 月
11 日 11: 11 不算,因为它里面没有两种数字。
【问题分析】
* 约束条件最大:月份日期
* 没有约束:年份
* 数据中要特别注意的是日月组合,因为一个月有几天取决于月份。
每个月可能的日子:
* 01月:11
* 02月:22
* 03-09月:无
* 10月:11
* 11月:01,10,12 -19,21
* 12月:11,22
发现3个一种数字只能是1或2。
年份是没有限制的四位数,题目要求四个数里三个数一样,只要确定月日和时分的情况数,那在此情况数上×
即是所有可能的情况数。(例如01月11日01时11分的年份可能是0111,1011,1101,1110四个)
【题解】
法一:手算
由于一年里的情况数较少,可以通过手算求解。按照上面的分析,先计算月日时分数,1月2月十月都是4种,11月33种,12月8种,总共是53种,再×=212种。
法二:编码
def check(n): # 检查3个一种数字是否是1或2 if n.count('1')==3 or n.count('2')==3: return
True return False day=[] # 用来存3个一种数字是1或2的日子 for m in range(1,13): for d in
range(1,31): s="%02d%02d"%(m,d) # 字符串格式:不满两个字符的前面补0;等价于:f"{m:0>2d}{d:0>2d}" #
上面可以改成s = "{:0>2}{:0>2}".format(m,d) s1=sorted(s) # 排序 if check(s):
day.append(s1) hour=[] # 用来存一天的所有分钟 for h in range(0,24): for m in range(0,60):
s="%02d%02d"%(h,m) # 字符串格式:不满两个字符的前面补0 s1=sorted(s) # 排序:月日和时分都排序,这样就方便作比较 if
check(s): hour.append(s1) cnt= 0 # 统计满足题意的天数 # 年份没有限制,满足月日和时分的年份也能满足,所以不需要遍历年份。
for j in day: # 遍历月日 for k in hour: # 遍历时分 if j==k: cnt+=1 print(cnt*4) #
满足每组月日时分的年份有四个排列 212
【拓展知识】
字符串格式化
* %C 格式化字符及其ASCII码
* %s 格式化字符串
* %d 格式化整数
* %u 格式化无符号整型
* %o 格式化无符号八进制数
* %X 格式化无符号十六进制数
* %f 格式化浮点数,可指定小数点后的精度
* %e 用科学计数法格式化浮点数
* %E 作用同%e,用科学计数法格式化浮点数
【收获】
* 若只需要比较两个字符串的字符是否相同(不要求顺序相同 ),做法:对字符串排序,然后用“==”判断。
* 字符串格式化输出