回文日期(日期枚举)
日期 枚举 回文
2023-09-14 09:01:26 时间
Question
在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。
牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。
显然:一个日期只有一种表示方法,而两个不同的日期的表示方法不会相同。
牛牛认为,一个日期是回文的,当且仅当表示这个日期的 8 位数字是回文的。
现在,牛牛想知道:在他指定的两个日期之间(包含这两个日期本身),有多少个真实存在的日期是回文的。
一个 8 位数字是回文的,当且仅当对于所有的 i(1≤i≤8) 从左向右数的第 i 个数字和第 9−i 个数字(即从右向左数的第 i 个数字)是相同的。
例如:
对于 2016 年 11 月 19 日,用 8 位数字 20161119 表示,它不是回文的。
对于 2010 年 1 月 2 日,用 8 位数字 20100102 表示,它是回文的。
对于 2010 年 10 月 2 日,用 8 位数字 20101002 表示,它不是回文的。
输入格式
输入包括两行,每行包括一个 8 位数字。
第一行表示牛牛指定的起始日期 date1,第二行表示牛牛指定的终止日期 date2。保证 date1 和 date2 都是真实存在的日期,且年份部分一定为 4 位数字,且首位数字不为 0。
保证 date1 一定不晚于 date2。
输出格式
输出共一行,包含一个整数,表示在 date1 和 date2 之间,有多少个日期是回文的。
输入样例:
20110101
20111231
输出样例:
1
Code
# 先枚举回文,然后判断是否在区间里面,最后判断是否是日期
date1 = int(input())
date2 = int(input())
def check(x):
days = [31,28,31,30,31,30,31,31,30,31,30,31]
# 取年月日,分别判断月日是否合法,因为年是从1000-10000遍历的所以必定合法
year = x // 10000
month = x // 100 % 100
day = x % 100
# year=x //10000
# month=x %10000//100
# day=x%10000%100
if month >12 or month < 1 or not month or not day:return False #月份越界
if month!=2 and days[month-1] < day:return False # 非二月天数越界 ,二月需要判断闰年平年
if month == 2:
if (year % 4 == 0 and year % 100!=0) or year % 400 == 0: # 闰年
if days[1]+ 1 < day:return False
else:
if days[1] < day:return False
return True
res = 0
for i in range(1000,10000):
# 将其变为回文
x = i
while(x):
i = i * 10 + x % 10
x //= 10
if date1 <= i <= date2: # 判断是否在date1和date2之间
# 判断是否是日期
if check(i):
res += 1
print(res)
相关文章
- java8中日期字符串的月日时分秒自动补零
- [Web] 日期格式化工具Moment.js
- 安卓手机便签怎么为预设提醒日期设置重要事项间隔?
- php时间日期
- datetime 模块详解 -- 基本的日期和时间类型
- sqlserver 日期时间函数
- MFC Windows 程序设计[198]之时间日期控件(附源码)
- Java日期相关类:Date、SimpleDateFormat和Calendar类常用API代码示例
- 使用枚举和结构输出日期
- Python编程:利用python编程实现对基于时间序列的数据(dataframe格式)按照指定时间范围进行单方向关联,不存在的日期补充为默认的NaN
- Android 文件按时间,大小,修改日期,类型的排序
- js 两个日期比较相差多少天
- Linux timedatectl控制系统时间和日期
- 【C++要笑着学】从零开始实现日期类 | 体会代码的复用 | 提供完整代码