Как найти количество високосных годов между двумя датами?
Я пытаюсь найти формулу для поиска количества високосных годов между двумя датами (меньший год - всегда високосный). В формуле ошибка. Помогите найти верную. Моя формула:
date=больший год - меньший год
кол-во високосных годов=date//4-date//100+date//400
Ответы (3 шт):
Существующая система дат, основана на григорианском календаре, впервые установленном в 1582 году папой римским Григорием XIII. Этот календарь был разработан для исправления ошибок, привнесенных менее точным юлианским календарем.
В григорианском календаре обычный год состоит из 365 дней. Поскольку фактическая продолжительность звездного года (период обращения Земли вокруг Солнца) составляет 365.2425 дней, «високосный год» в 366 дней используется один раз каждые четыре года для устранения ошибки, вызванной тремя обычными (но короткими) годами. Любой год, который делится на 4 без остатка, является високосным годом: например, 1988, 1992 и 1996 годы являются високосными годами.
Тем не менее, есть еще небольшая ошибка, которая должна быть учтена. Чтобы устранить эту ошибку, григорианский календарь предусматривает, что год, который делится без остатка на 100 (например, 1900) является високосным годом только в том случае, если он также без остатка делится на 400.
По этой причине следующие годы не являются високосными:
1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600
Это потому, что они делятся без остатка на 100, но не на 400.
Следующие годы – високосные: 1600, 2000, 2400
Это потому, что они делятся без остатка на 100 и 400.
Как определить, является ли год високосным Чтобы определить, является ли год високосным, выполните следующие действия:
Если год делится на 4 без остатка, перейдите на шаг 2. В противном случае перейдите к выполнению действия 5.
Если год делится на 100 без остатка, перейдите на шаг 3. В противном случае перейдите к выполнению действия 4.
Если год делится на 400 без остатка, перейдите на шаг 4. В противном случае перейдите к выполнению действия 5.
Год високосный (366 дней).
Год не високосный год (365 дней).
Для сомневающихся это не GPT, это микрософт
Вычитать годы нельзя. Потому что в паре 1896-1900 один високосный год, а в паре 1996-2000 два високосных года. А разница у обеих пар одна - четыре года.
Можно для каждого года из пары вычислить некоторое условное количество високосных лет с начала эпохи. Само по себе это число не имеет смысла, но разница таких чисел – количество високосных лет в промежутке. Если началом эпохи выбрать единицу (первый год нашей эры), формула будет проще всего:
fy = ⌊y/4⌋ - ⌊y/100⌋ + ⌊y/400⌋
Количество високосных лет на промежутке [y1, y2]:
Fy1,y2 = fy2 - fy1-1
def n_leap_years(y1, y2):
def f(y):
return y // 4 - y // 100 + y // 400
return f(y2) - f(y1 - 1)
print(n_leap_years(*(map(int, input().split()))))
От первого до двухтысячного года было 485 високосных лет. Как я уже сказал это условное число, григорианский календарь так далеко в прошлое не простирается.
$ echo 1 2000 | python leap-years.py 485
А вот уже реальные примеры:
$ echo 1996 2000 | python leap-years.py 2 $ echo 1896 1900 | python leap-years.py 1
Консольный скрипт:
import os
year_start = 2000
year_end = 2025
print(sum(1 for year in range(year_start, year_end) if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)))
os.system("pause > nul" if os.name == "nt" else "read > /dev/null")