Про високосный год

by

Пару раз у нас возникали споры насчёт того, что такое високосный год. Все знают, что это каждый четвёртый год, но почему тогда 1900 год не был високосным, а 2000 — был?

Конечно, можно погуглить или посмотреть в википедии. Но зачем, если у нас есть свой сайт, на который можно захуйбамбостить статью с тутбая?

История високосного года идёт от Юлия Цезаря, который ввёл календарь, основанный на том, что период обращения Земли вокруг Солнца примерно равен 365,25 суток (365 суток и 6 часов). Для того, чтобы выровнять шестичасовое смещение, был введён високосный год. Три года считалось по 365 суток, а в каждый год, кратный четырём, добавлялись одни дополнительные сутки в феврале.

В 1582 году папа римский Григорий XIII провёл реформу календаря. В результате, для соответствия среднего календарного года солнечному, было решено изменить правило високосных лет. Теперь год является високосным, если он кратен 4 и при этом не кратен 100 либо кратен 400. Год не является високосным, если он не кратен 4 либо кратен 4, но при этом кратен 100 и не кратен 400.

Источник

Метки:

комментариев 36 to “Про високосный год”

  1. Alex Pooh Says:

    Ммм…
    Я один знал это с седьмого класса? :)

    Кстати, где-то с месяц назад, будучи в Бобруйске, по Главному Самому Первому Национальному Радио слышал передачу, в которой охуенно подробно и занимательно на белорусском (!) языке рассказывали историческую историю про Юлианский (от Юлия Цезаря) календарь. Причем начиная с календаря древнеегипетского, который кем-то там до сих пор считается самым зачотным.
    А в Риме изначально с календарем была полная жопа — каждый новый Главный Священнослужитель (точное название не помню) вводил свой Новый Год, так как в этот месяц собирались налоги. А потом пришел Цезарь и всех построил. Военный, хуле.

  2. dusiapapa Says:

    Теперь все смогут говорить, что знали это с седьмого класса :)

  3. mahadeo Says:

    Теперь год является високосным, если он кратен 4 и при этом не кратен 100 либо кратен 400. Год не является високосным, если он не кратен 4 либо кратен 4, но при этом кратен 100 и не кратен 400.

    Почему бы не написать просто и ясно: годы 2000, 2400 — високосные. Годы 2100, 2200, 2300 — не високосные. Презираю профессиональных журналистов, которые не могут понятно донести мысль до читателя.

  4. dusiapapa Says:

    И не говори, mahadeo. Написали бы просто:

    bool IsLeap(int year)
    {
    if(IsMultipleOf(year, 400))
    {
    return true;
    }
    else
    {
    if(IsMultipleOf(year, 100))
    {
    return false;
    }
    else
    {
    return IsMultipleOf(year, 4);
    }
    }
    }

  5. Alex Pooh Says:

    Ты знаешь, на С++, с использованием оператора «%», вышло бы красивше как-то. И понятнее :)

    Опять же, что за форматирование?

  6. dusiapapa Says:

    Тоже мне, сишник нашёлся :)

    Обрезает пробелы, сцоко.

  7. Alex Pooh Says:

    Use HTML :)

  8. dusiapapa Says:

    Go fuck yourself :)

  9. pavek Says:

    Даа.. в нормальных С-синитаксисах все куда как проще:

    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    //leap year;

  10. dusiapapa Says:

    Лаконично…
    Зато у меня более оптимальный алгоритм, проверок условий меньше :)

  11. Alex Pooh Says:

    !(year % 400) || (!(year % 4) && year % 100)
    как-то так лаконичнее

  12. dusiapapa Says:

    Да уж, а начиналось всё с «Почему бы не написать просто и ясно…»

    P.S. Всё равно в моём алгоритме сравнений меньше, и работать он будет быстрее :)

  13. Alex Pooh Says:

    Ммм… В моем алгоритме ни одного вызова функции. И говорить, что нечто на дотнете работает быстрее, чем код на сях — нонсенс :)

  14. dusiapapa Says:

    Ммм… А кто тебе сказал, что это дотнет? Это си, а функции инлайновые.

    UPD: И вообще, при чём тут платформы? Я говорил об алгоритмах.

  15. Alex Pooh Says:

    Хо-хо! В алгоритмах не бывает инлайновых функций!

  16. dusiapapa Says:

    Ну вот привязался! Для особо умных поясню.

    1. Алгоритм мой более оптимален благодаря меньшему числу сравнений. И в гробу я видел си и дотнет вместе взятые.

    2. Если ты хочешь поговорить о скорости работы моего алгоритма с каким-нибудь компилятором или платформой, то считай, что это код на си и функция IsMultipleOf инлайновая. В этом случае предложенная мной программа будет оптимальнее твоей потому, что см. п.1.

    3. Ты и сам всё это прекрасно знаешь, но твоя уязвлённая гордость не позволяет тебе перестать писать свои говнокоменты на этот говнопост :)

  17. Alex Pooh Says:

    Чувак, при чем здесь количество логических операций? Мой код выполнится за меньше число тактов, потому что в нем нет ни одного джампа. А с твоим количеством if-ов у тебя постоянно будет сбрасываться конвейер процессора из-за передачи управления.
    И не надо тут говорить, что чья-то там гордость мешает признать чью-то неправоту :)

  18. dusiapapa Says:

    Такты? Джампы? Конвейер? Кто тебе про них рассказал? Я его ненавижу! :)

    UPD: Но абстрагируясь от платформ и аппаратной части мой алгоритм оптимальнее, согласись хотя бы с этим :)

  19. Alex Pooh Says:

    Ммм…
    По каким же критериям, черт побери? Я бы и рад это признать, но ты не оставляешь мне выбора этим словом «оптимальнее»! :)

  20. dusiapapa Says:

    Возьмём частный случай — 2000 год.
    Твой алгоритм проверит его на делимость на 4, на 400 и на 100. А мой — только на 400.

    Под оптимальностью я подразумевал именно это — меньшее количество проверок :)

  21. Alex Pooh Says:

    В случае 2000 года мой алгоритм получает true на !(year % 400) и заканчивает вычисления. Это Си и дефолтные настройки компилятора :)

  22. dusiapapa Says:

    Мы же договорились абстрагироваться от платформ/компиляторов :)

    Но даже если так, то в случае с 1900 годом у тебя все три проверки сработают :)

  23. Alex Pooh Says:

    Ай ну тебя, таких частных случаев — меньшинство. А для большинства у меня выполнится вот досюда: !(year % 400) || (!(year % 4)
    И все.

    Гордец! :)

  24. dusiapapa Says:

    Меньшинство — не меньшинство, а в бесконечном приближении мой алгоритм оптимальнее. И всё.

    Упрямый осёл! :)

  25. Alex Pooh Says:

    Ну-ка, ну-ка, докажи про бесконечное приближение. В бесконечном приближении решающее значение будет играть оптимизация для наиболее часто встречающегося случая — а это невисокосный год, не делящийся на 100.

    Дилетант! :)

  26. dusiapapa Says:

    Может про бесконечное приближение я и загнул. Объясняю по-простому.

    В твоём алгоритме (а не программе на С) для любого числа выполняются все три проверки.

    В моём алгоритме для каждого сотого числа — две, а для каждого четырёхсотого — вообще одна.

    Вот и всё.

  27. Alex Pooh Says:

    Товарищ! Любой нормальный человек (абстрагируясь от процессоров, платформ и компиляторов), получив True в левой части оператора нестрогой дизъюнкции, дальше считать не будет. То же, получив False для конъюнкции.
    В моем алгоритме для тотально подавляющего большинства чисел выполняются две проверки.
    В твоем алгоритме — три.

    Вот и все.

  28. dusiapapa Says:

    Точно! Сцоко, я понял!
    Вот самый оптимальный в бесконечном приближении алгоритм:

    if (year % 4) return false;
    if (!(year % 400)) return true;
    return (year % 100);

  29. mahadeo Says:

    Вы ебанулись

  30. JSman Says:

    и че вы хуйней страдаете?

    if (year % 4) return false;
    if (!(year % 400)) return true;
    return true;

  31. JSman Says:

    function isLeapYear(year){
    return (0 == year % 4 && 0 != year % 100) || (0 == year % 400);
    }

  32. Alex Pooh Says:

    Это кто тут такой ебанутый?

  33. dusiapapa Says:

    По-моему, он ебанулся.

  34. Peter Moroz Says:

    Позвольте мне предложить решение
    Високосный год определяется по следующему правилу:
    Год високосный, если он делится на четыре без остатка, но если он делится на 100 без остатка, это не високосный год. Однако, если он делится без остатка на 400, это високосный год. Таким образом, 2000 г. является особым високосным годом, который бывает лишь раз в 400 лет.
    Пусть множество A — значения, делящиеся на 4 без остатка,
    множество B — значения, делящиеся на 100 без остатка,
    множество C — значения, делящиеся на 400 без остатка.

    Очевидно, что C является подмножеством B, которое, в свою очередь, является подмножеством A. Оптимальный алгоритм будет сначала обрабатывать наиболее вероятные значения, и уже потом (если не прекратит выполнение) переходить к следующим.

    bool isLeapYear(int y) {
    if (!(y % 4)) {
    if (!(y % 100)) {
    if (!(y % 400))
    return true;
    else
    return false;
    }
    return true;
    }
    return false;
    }

  35. google Says:

    I used to be suggested this website by my cousin.
    I’m no longer positive whether or not this put up is written via him as no one else realize such precise approximately my difficulty. You’re incredible!

    Thank you!

Оставьте комментарий