Как найти високосный год на питоне

На чтение 3 мин Просмотров 13.5к. Опубликовано 01.04.2022

Содержание

  1. Введение
  2. Первый способ
  3. Проверка
  4. Второй способ
  5. Проверка
  6. Третий способ
  7. Проверка
  8. Заключение

Введение

Рассмотрим три способа проверки года на високосность с помощью python.

Високосный год – календарный год, содержащий в солнечных календарях дополнительный день, в лунно-солнечных календарях – дополнительный месяц для синхронизации с астрономическим, или сезонным, годом.

Первый способ

В данном варианте программы мы с Вами напишем программу с более подробным и понятным кодом.

Для начала создадим переменную year, в которую пользователь будет вводить проверяемый год:

year = int(input('Введите год: '))

Високосным годом является тот год, который нацело делится на 4, кроме столетий (исключением являются столетия делящиеся на 400).

Далее создадим условие, в котором проверим, если год делится на 4 без остатка, то он является не високосным:

if year % 4 != 0:
    print('Год не високосный.')

Теперь добавим elif, в котором проверим, делится ли год на 100 без остатка. Если да, то сработает условие, в котором проверяется делимость года на 400 без остатка, а если же нет, то сработает else. После elif тоже будет идти else, выводящее сообщение о високосности года.

Код:

elif year % 100 == 0:
    if year % 400 == 0:
        print('Год високосный.')
    else:
        print('Год не високосный.')
else:
    print('Год високосный.')

Проверка

И так, проверим работоспособность программы, введём в консоль 2020 год, которяый является високосным:

Ввод >> Введите год: 2020
Вывод >> Год високосный.

Теперь введём 2022 год, не являющийся високосным:

Ввод >> Введите год: 2022
Вывод >> Год не високосный.

Полный код программы:

year = int(input('Введите год: '))

if year % 4 != 0:
    print('Год не високосный.')

elif year % 100 == 0:
    if year % 400 == 0:
        print('Год високосный.')
    else:
        print('Год не високосный.')
else:
    print('Год високосный.')

Второй способ

Во втором способе мы значительно сократим код.

В коде будет производиться проверка на деление года нацело на 4, или 400, а так же на кратность 100:

year = int(input('Введите год: '))

if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
    print('Год високосный.')
else:
    print('Год не високосный.')

Проверка

Произведём те же проверки, что и в первом способе:

Ввод >> Введите год: 2020
Вывод >> Год високосный.
Ввод >> Введите год: 2022
Вывод >> Год не високосный.

Третий способ

В третьем способе воспользуемся модулем calendar. В модуле calendar есть функция isleap(), возвращающая True, если год високосный и False если нет.

Код:

import calendar
year = int(input('Введите год: '))

if calendar.isleap(year):
    print('Год високосный.')
else:
    print('Год не високосный.')

Проверка

Для разнообразия проверим 2024 год, являющийся високосным и 2025, не являющийся високосным.

Ввод >> Введите год: 2024
Вывод >> Год високосный.
Ввод >> Введите год: 2025
Вывод >> Год не високосный.

Заключение

В статье мы с Вами разобрали 3 способа проверки года на високосность с помощью python.

Спасибо всем, кто читал, удачи Вам 😉

Дано натуральное число. Требуется определить, является ли год с данным номером високосным. Если год является високосным, то выведите YES, иначе выведите NO. Напомним, что в соответствии с григорианским календарем, год является високосным, если его номер кратен 4, но не кратен 100, а также если он кратен 400.

i = int(input())

if (i % 4 == 0 or i % 400 == 0) and i % 100 != 0:
    print("YES")
else:
    print("NO")

Прошу не показать правильный ответ, а разъяснить в чём моя ошибка и почему код работает не корректно)
Я только учусь, всем заранее спасибо!

Kromster's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 1 июл 2020 в 5:34

Fezli's user avatar

5

Условие нужно переписать так:

if (i % 4 == 0 and i % 100 != 0) or i % 400 == 0:

Потому что то условие, которое написали вы, проверяет, что год кратен 400 и одновременно не кратен 100, что, очевидно, не может выполняться.

ответ дан 1 июл 2020 в 6:45

Xander's user avatar

XanderXander

20k3 золотых знака25 серебряных знаков52 бронзовых знака

import calendar

print(calendar.isleap(int(input())))

ответ дан 1 июл 2020 в 6:47

вася's user avatar

васявася

1412 серебряных знака23 бронзовых знака

1

An alternative one liner:

((((y % 4) + (int((y - (y % 100)) / y) * ((y % 400) / 100))) - 1) < 0)

This was something that I put together for fun (?) that is also 1:1 compatible with C.

(y % 4) >>>It first checks if the year is a leap year via the typical mod-4 check.

(int((y - (y % 100)) / y) >>>It then accounts for those years divisible by 100. If the year is evenly divisible by 100, this will result in a value of 1, otherwise it will result in a value of 0.

((y % 400) / 100))) >>>Next, the year is divided by 400 (and subsequently 100, to return 1, 2, or 3 if it is not.

These two values

(int(y - (y % 100)) / y)

&

((y % 400) / 100)))

are then multiplied together. If the year is not divisible by 100, this will always equal 0, otherwise if it is divisible by 100, but not by 400, it will result in 1, 2, or 3. If it is divisible by both 100 and 400, it will result in 0.

This value is added to (y % 4), which will only be equal to 0 if the year is a leap year after accounting for the edge-cases.

Finally, 1 is subtracted from this remaining value, resulting in -1 if the year is a leap year, and either 0, 1, or 2 if it is not. This value is compared against 0 with the less-than operator. If the year is a leap year this will result in True (or 1, if used in C), otherwise it will return False (or 0, if used in C).

Please note: this code is horribly inefficient, incredibly unreadable, and a detriment to any code attempting to follow proper practices. This was an exercise of mine to see if I could do so, and nothing more.

Further, be aware that ZeroDivisionErrors are a consequence of the input year equaling 0, and must be accounted for.

For example, a VERY basic timeit comparison of 1000 executions shows that, when compared against an equivalent codeblock utilizing simple if-statements and the modulus operator, this one-liner is roughly 5 times slower than its if-block equivalent.

That being said, I do find it highly entertaining!

Всем привет! Недавно решал задачи с помощью Python.
В задаче просили вычислить високосный год.
Признаюсь честно что я всегда думал что високосный год или
нет прописано в календарях. к примеру каждый четвертый.
Оказывается есть алгоритм для определения високосный год или нет.
Вот он:

1. Если год делится без остатка на 4
и если остаток от деления на 100 не равен 0
или если год делится без остатка на 400
то такой год будет високосным.

В остальных случаях год будет не високосным.

Скрипт на Python 3 выглядит так:

# -*- coding: utf - 8 -*-
 
def year_is(year):
    if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
        return "високосный"
    else:
        return "не високосный"
 
year = int(input("введите год :"))
print(year_is(year))

Стандартный год состоит из 365 дней, а високосный из 366 дней. Високосный год кратен 4, но при этом не кратен 100, либо кратен 400. Иными словами, если год делится на 4 без остатка, но делится на 100 только с остатком, то он високосный, иначе — невисокосный, кроме случая, если он делится без остатка на 400 — тогда он всё равно високосный.

Проверка с помощью условия if

На Python можно выполнить проверку использовав вышеописанные условия:

year = 2019

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

Проверка с дополнительными условиями elif

Данная программа поможет лучше понять логику проверки года на високосность.

year = 2019

if year % 400 == 0:
    print("%d високосный" %year)
elif year % 100 == 0:
    print("%d не високосный" %year)
elif year % 4 == 0:
    print("%d високосный" %year)
else:
    print("%d не високосный" %year)

Понравилась статья? Поделить с друзьями:
  • Как составить список имен файлов
  • Как найти кто писал в инстаграме
  • Как найти сайт яндекс дзен
  • Как найти точку минимума функции через производную
  • Как найти коэффициент касательной к окружности