首页 > 试题广场 >

回文日期

[编程题]回文日期
  • 热度指数:2449 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}一个日期用 \sf YYYYMMDD8 位数字表示,其中前四位为年份,接着两位为月份,最后两位为日期。

\hspace{15pt}若这 8 位数字本身是一个回文数,则称该日期为回文日期

\hspace{15pt}给定起始日期 a 与终止日期 b(均包含在内,且满足 a\leqq b),请计算区间内真实存在的回文日期数量。

\hspace{15pt}【名词解释】回文数:一个数字从左往右读与从右往左读完全相同。

\hspace{15pt}【日期合法性】
\hspace{23pt}\bullet\, 1,3,5,7,8,10,12 月有 31 天;
\hspace{23pt}\bullet\, 4,6,9,11 月有 30 天;
\hspace{23pt}\bullet\, 2 月在闰年29 天,平年有 28 天。

\hspace{15pt}【闰年判定】
\hspace{23pt}\bullet\, 能被 4 整除但不能被 100 整除的年份;
\hspace{23pt}\bullet\, 或能被 400 整除的年份。

输入描述:
\hspace{15pt}第一行输入 8 位整数 a,表示起始日期。
\hspace{15pt}第二行输入 8 位整数 b,表示终止日期。


输出描述:
\hspace{15pt}输出一个整数,表示 [a,b] 区间内回文日期的数量。
示例1

输入

20110101
20111231

输出

1

说明

\hspace{15pt}在这个样例中,在 \sf{20110101}\sf{20111231} 之间,回文日期有 1 个,即 \sf{20111102}
示例2

输入

20000101
20101231

输出

2

说明

\hspace{15pt}在这个样例中,在 \sf{20000101}\sf{20101231} 之间,回文日期有 2 个,即 \sf{20010002}\sf{20100102}

def is_runnian(year):
    if (year%4 == 0 and year%100 != 0) or year%400 == 0:
        return True
    else:
        return False

def is_valid(y,m,d):
    if int(m)<=0 or int(m)>12:
        return False
    day = [31,28,31,30,31,30,31,31,30,31,30,31]
    if is_runnian(int(y)):
        day[1] = 29
    if int(d) > day[int(m)-1]:
        return False
    return True
   

start = input()
ys = start[0:4]
end = input()
ye = end[0:4]
cont = 0
for i in range(int(ys),int(ye)+1): #9220
    year = str(i).zfill(4)
    strs = year[::-1] #0229
    month,day = strs[:2],strs[2:]
    if is_valid(year,month,day):
        cont += 1
print(cont)

发表于 2025-09-24 21:23:25 回复(0)