洛谷 P2010 [NOIP 2016 普及组] 回文日期 Python
方法一:
不知道为什么无法通过Subtask #1,明明试了结果正确(如果有人知道希望可以告诉我下)
start = input()
end = input()
count = 0
mark_y = 0 #用来标记是否为起始年
mark_m = 0 #用来标记是否为起始月
for i in range(int(start[0:4]),int(end[0:4])+1):
year = 0
if int((str(i)[0:2])[::-1]) > 31 or int((str(i)[2:4])[::-1]) >12 :
#年份的第一、二位数倒过去就表示日期,第三、四位数表示月份。先判断倒过来是不是合法日期
mark_y = 1 #为标记赋值,表示已经跳过起始年
mark_m = 1
continue#跳过后面的代码进入下一次循环
if (i % 4 == 0 and i % 100 != 0) or i % 400 == 0:#判断是否为闰年
year = 1
if mark_y == 0:#判断是否为起始年份,如果是起始年份月要从给定月份开始,不是就从1月开始
j_star = int(start[4:6])
mark_y = 1
else:
j_star = 1
for j in range(j_star,13):
if mark_m == 0:#判断是否为起始月,如果是日期就要从给定日期开始
k_star = int(start[6:8])
mark_m = 1
else:
k_star = 1
if j in(1,3,5,7,8,10,12):
day = 31
elif j in(4,6,9,11):
day = 30
else:
day = 28 + year
if j < 10 :
j = "0"+str(j)
for k in range(k_star,day+1):
#for k in range(1,day+1):
if k < 10 :
k = "0"+str(k)#格式化数字,为一位数前面加0
date = str(i)+str(j)+str(k)
r_date = date[::-1]#使字符串反向排序
if date == r_date:
count += 1
#if date == r_date and int(start) <= int(date) <= int(end):
# count += 1
if date == end:
print(count)
exit()
print(count)
方法一改:ac了,更改部分为方法一中日期k循环中注释掉的代码
start = input()
end = input()
count = 0
mark_y = 0 #用来标记是否为起始年
mark_m = 0 #用来标记是否为起始月
for i in range(int(start[0:4]),int(end[0:4])+1):
year = 0
if int((str(i)[0:2])[::-1]) > 31 or int((str(i)[2:4])[::-1]) >12 :
#年份的第一、二位数倒过去就表示日期,第三、四位数表示月份。先判断倒过来是不是合法日期
mark_y = 1 #为标记赋值,表示已经跳过起始年
mark_m = 1
continue#跳过后面的代码进入下一次循环
if (i % 4 == 0 and i % 100 != 0) or i % 400 == 0:#判断是否为闰年
year = 1
if mark_y == 0:#判断是否为起始年份,如果是起始年份月要从给定月份开始,不是就从1月开始
j_star = int(start[4:6])
mark_y = 1
else:
j_star = 1
for j in range(j_star,13):
if mark_m == 0:#判断是否为起始月,如果是日期就要从给定日期开始
k_star = int(start[6:8])
mark_m = 1
else:
k_star = 1
if j in(1,3,5,7,8,10,12):
day = 31
elif j in(4,6,9,11):
day = 30
else:
day = 28 + year
if j < 10 :
j = "0"+str(j)
for k in range(1,day+1):
if k < 10 :
k = "0"+str(k)#格式化数字,为一位数前面加0
date = str(i)+str(j)+str(k)
r_date = date[::-1]#使字符串反向排序
if date == r_date and int(start) <= int(date) <= int(end):
count += 1
if date == end:
print(count)
exit()
print(count)
方法二:简化了代码且ac,但是耗时似乎增加了
start = input()
end = input()
day =[0,31,28,31,30,31,30,31,31,30,31,30,31]
count = 0
for i in range(int(start[0:4]),int(end[0:4])+1):
if int((str(i)[0:2])[::-1]) > 31 or int((str(i)[2:4])[::-1]) >12 :
#年份的第一、二位数倒过去就表示日期,第三、四位数表示月份。先判断倒过来是不是合法日期
continue#跳过后面的代码进入下一次循环
if (i % 4 == 0 and i % 100 != 0) or i % 400 == 0:#判断是否为闰年
day[2] = 29
else:
day[2] = 28
for j in range(1,13):
for k in range(1,day[j]+1):
date = f"{i:04d}{j:02d}{k:02d}"#格式化年月日,位数不足在前补0
r_date = date[::-1]#使字符串date反序
if date == r_date and int(start) <= int(date) <= int(end):
count += 1
print(count)