第十二届蓝桥杯国赛完全日期(日期api)

1. 问题描述:

如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。例如: 2021 年 6 月 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16,而16 是一个完全平方数,它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。例如: 2021 年 6 月 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16,是一个完全平方数。所以 2021 年 6 月 23 日也是一个完全日期。
请问,从 2001 年 1 月 1 日到 2021 年 12 月 31 日中,一共有多少个完全日期?

2. 思路分析:

分析题目可以知道我们模拟整个过程即可,在2001年1月1日到2021年12月31日之间计算每一天对应的日期是否满足条件即可。因为使用的是python语言所以可以使用python中的datetime模块(使用api一般不会出现日期上的计算错误而且可以快速计算出结果),datetime模块(datetime模块主要涉及到日期和时间的相关操作)中有一个通过date()函数传递起始年月日对应的日期从而获得一个date对象,在date函数传递结束年月日对应的日期获得一个date对象,通过timedelta函数设置两个日期间隔的天数,这样就可以通过累加每一天得到当前的日期,然后计算当前日期是否满足题目要求即可。

3. 代码如下:

答案是977

from datetime import *
import math

# 计算当前的日期是否满足条件
def solve(day: int, month: int, year: int):
    res = 0
    while day:
        res += day % 10
        day //= 10
    while month:
        res += month % 10
        month //= 10
    while year:
        res += year % 10
        year //= 10
    return int(math.sqrt(res)) * int(math.sqrt(res)) == res


if __name__ == '__main__':
    start = date(2001, 1, 1)
    end = date(2021, 12, 31)
    # 设置日期的间隔天数
    days = timedelta(days=1)
    res = 0
    while start <= end:
        d, m, y = start.day, start.month, start.year
        if solve(d, m, y):
            res += 1
        start += days
    print(res)

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值