特殊时间 问题

文章描述了一道蓝桥杯编程竞赛中的问题,该问题涉及寻找特定格式的时间,即年、月、日和时、分均由3个相同数字和1个不同数字组成。提供的Python代码通过枚举数字和检查日期及时间的合法性来计算满足条件的组合总数。
摘要由CSDN通过智能技术生成

蓝桥杯 | 特殊时间 问题 | python

问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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 不算,因为它里面没有两种数字。
运行限制
最大运行时间:1s
最大运行内存: 512M

  1. 官方题解
    在这里插入图片描述
# 闰年的时候2月有29天,但是29这两个数字无法构成任何合法时间,因此不用判断闰年。
day_per_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
'''
表示日期和时刻的数字取值范围固定,对日期和时刻进行合法性检测
'''
def check_D(D):                     # 检查日期D(四位数)是否合法
    month = D // 100
    day = D % 100
    if month < 1 or month > 12:
        return 0
    if day < 1 or day > day_per_month[month]:
        return 0
    return 1
def check_H(H):                     # 检查时刻H(四位数)是否合法
    h = H // 100
    m = H % 100
    if h < 0 or h > 23:
        return 0
    if m < 0 or m > 59:
        return 0
    return 1
'''
枚举可能的2个数字
累计满足条件的N_D, N_H
'''
ans = 0
for a in range(10):                 # 枚举第一个数字
    for b in range(10):             # 枚举第二个数字
        if a == b:                  # 题目要求是2个数字,1个数字时下面代码都不执行
            continue
        N_Y, N_D, N_H = 4, 0, 0     # 合法数量。给定2个数字的情况下,年份只有4种可能(固定)
        A = [a, a, a, a]            # 对4个位分别替换得到baaa,abaa,aaba,aaab
        for i in range(4):          # 枚举四种情况baaa,abaa,aaba,aaab
            A[i] = b
            number = 0              # 转换为数字
            for j in A:
                number = number * 10 + j
            N_D += check_D(number)  # 调用合法性检查
            N_H += check_H(number)
            # 整个4种情况合法性检查完得出这一轮满足要求的日期、时刻个数
            A[i] = a                # 变成b的那位恢复,方便下一次替换操作
        ans += N_Y * N_D * N_H      # 所有轮(枚举a和b)累加
print(ans)
  • 代码过程:
abA可能
00
1[ 0,0,0,0 ][ 1,0,0,0 ]
[ 0,1,0,0 ]
[ 0,0,1,0 ]
[ 0,0,0,1 ]
9[ 9,0,0,0 ]
[ 0,9,0,0 ]
[ 0,0,9,0 ]
[ 0,0,0,9 ]
10[ 1,1,1,1 ][ 0,1,1,1 ]
[ 1,0,1,1 ]
[ 1,1,0,1 ]
[ 1,1,1,0 ]
90[ 9,9,9,9 ][ 0,9,9,9 ]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值