Расчет количества дней рождений до указанной даты
Задача 1C. [C] Дни рождения
- Имя входного файла: стандартный ввод
- Имя выходного файла: стандартный вывод
- Ограничение по времени: 1 секунда
- Ограничение по памяти: 256 мегабайт
Петя и Вася родились в один год y1. При этом известно, что это високосный год, и Пете повезло родиться 29го февраля. Вася, его друг, родился в день d1 m1-го месяца (иными словами, дата его рождения — d1.m1.y1). В день d2.m2.y2 друзьям стало интересно, сколько дней рождения было у каждого до этой даты (включительно). Помните, что из-за того, что Петя родился 29го февраля, день рождения у него бывает не каждый год. Формат входных данных В первой строке записан день рождения Васи в формате d1.m1.y1(1 6 y1 6 109 ). Во второй строке записана текущая дата в d2.m2.y2(1 6 y2 6 109 ). Дополнительно гарантируется, что y1 < y2 и y1 — високосный год.
Формат выходных данных.
стандартный ввод
20.6.2000
17.7.2024
стандартный вывод
7 25
стандартный ввод
29.2.2004
29.2.5004
стандартный вывод
728 728
стандартный ввод
17.1.2008
26.3.347297
стандартный вывод
83734 345290
Вот попытка решения (Прошла все три базовых теста, но стопориться о четвёртый):
data1=str(input()) # День Рождения Васи
data2=str(input()) # Настоящий год
d1,m1,y1=map(int, data1.split("."))
d2,m2,y2=map(int, data2.split("."))
def is_leap_year(year):
return (year%4==0 and year%100!=0) or (year%400==0)
def cnt_years(year):
return year//4 - year//100 + year//400
bir2=cnt_years(y2)-cnt_years(y1) #Петя
if (m2>2 or (d2>=29 and m2==2)):
bir2+=1
bir1=y2-y1
if (m1==2 and d1==29):#Вася
bir1=bir2
elif m1<m2 or (m1==m2 and d1<d2):
bir1+=1
print(bir2,bir1)
Ответы (2 шт):
Это задача на включение и исключение множеств.
Надо написать функцию, которая считает, сколько високосных лет от 0 до переданного (каждый четвёртый минус каждый сотый плюс каждый четырёхсотый - вспоминаем включение/исключение).
А чтобы найти количество между двумя годами включительно, надо вычислить f(y-d) - f(x-1), где d означает отрицание того, что день рождения уже наступил в текущем году.
Кажется, в твоём коде косяк в той части, где ты пытаешься вместо модификации года (одного на 1, а другого через d) как-то модифицировать результат после вычисления. Теоретически так посчитать возможно, но гораздо запутаннее.
d1, m1, y = 29, 2, None
d2, m2, y = map(int, input().split('.'))
d3, m3, y3 = map(int, input().split('.'))
def is_leap_year(year):
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
first_400 = y if y % 400 == 0 else y - (y % 400) + 400
last_400 = y3 - y3 % 400
count_400 = (last_400 - first_400) // 400 + 1
first_100 = y if y % 100 == 0 else y - (y % 100) + 100
last_100 = y3 - y3 % 100
count_100 = (last_100 - first_100) // 100 + 1
first_4 = y
last_4 = y3 - y3 % 4
count_4 = (last_4 - first_4) // 4 + 1
petya = count_4 - count_100 + count_400
if is_leap_year(y3):
if m3 < m1 or (m3 == m1 and d3 < d1):
petya -= 1
if d1 == d2 and m1 == m2:
vasya = petya
else:
vasya = y3 - y + 1
if m3 < m2 or (m3 == m2 and d3 < d2):
vasya -= 1
print(petya, vasya)