Пару раз у нас возникали споры насчёт того, что такое високосный год. Все знают, что это каждый четвёртый год, но почему тогда 1900 год не был високосным, а 2000 — был?
Конечно, можно погуглить или посмотреть в википедии. Но зачем, если у нас есть свой сайт, на который можно захуйбамбостить статью с тутбая?
История високосного года идёт от Юлия Цезаря, который ввёл календарь, основанный на том, что период обращения Земли вокруг Солнца примерно равен 365,25 суток (365 суток и 6 часов). Для того, чтобы выровнять шестичасовое смещение, был введён високосный год. Три года считалось по 365 суток, а в каждый год, кратный четырём, добавлялись одни дополнительные сутки в феврале.
В 1582 году папа римский Григорий XIII провёл реформу календаря. В результате, для соответствия среднего календарного года солнечному, было решено изменить правило високосных лет. Теперь год является високосным, если он кратен 4 и при этом не кратен 100 либо кратен 400. Год не является високосным, если он не кратен 4 либо кратен 4, но при этом кратен 100 и не кратен 400.
Метки: високосный год
Четверг, 27 декабря, 2007 в 10:27 |
Ммм…
Я один знал это с седьмого класса? :)
Кстати, где-то с месяц назад, будучи в Бобруйске, по Главному Самому Первому Национальному Радио слышал передачу, в которой охуенно подробно и занимательно на белорусском (!) языке рассказывали историческую историю про Юлианский (от Юлия Цезаря) календарь. Причем начиная с календаря древнеегипетского, который кем-то там до сих пор считается самым зачотным.
А в Риме изначально с календарем была полная жопа — каждый новый Главный Священнослужитель (точное название не помню) вводил свой Новый Год, так как в этот месяц собирались налоги. А потом пришел Цезарь и всех построил. Военный, хуле.
Четверг, 27 декабря, 2007 в 11:10 |
Теперь все смогут говорить, что знали это с седьмого класса :)
Четверг, 27 декабря, 2007 в 13:14 |
Почему бы не написать просто и ясно: годы 2000, 2400 — високосные. Годы 2100, 2200, 2300 — не високосные. Презираю профессиональных журналистов, которые не могут понятно донести мысль до читателя.
Четверг, 27 декабря, 2007 в 13:31 |
И не говори, mahadeo. Написали бы просто:
bool IsLeap(int year)
{
if(IsMultipleOf(year, 400))
{
return true;
}
else
{
if(IsMultipleOf(year, 100))
{
return false;
}
else
{
return IsMultipleOf(year, 4);
}
}
}
Четверг, 27 декабря, 2007 в 14:20 |
Ты знаешь, на С++, с использованием оператора «%», вышло бы красивше как-то. И понятнее :)
Опять же, что за форматирование?
Четверг, 27 декабря, 2007 в 14:22 |
Тоже мне, сишник нашёлся :)
Обрезает пробелы, сцоко.
Четверг, 27 декабря, 2007 в 17:10 |
Use HTML :)
Четверг, 27 декабря, 2007 в 17:41 |
Go fuck yourself :)
Пятница, 28 декабря, 2007 в 15:55 |
Даа.. в нормальных С-синитаксисах все куда как проще:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
//leap year;
Пятница, 28 декабря, 2007 в 16:00 |
Лаконично…
Зато у меня более оптимальный алгоритм, проверок условий меньше :)
Суббота, 29 декабря, 2007 в 10:32 |
!(year % 400) || (!(year % 4) && year % 100)
как-то так лаконичнее
Суббота, 29 декабря, 2007 в 10:41 |
Да уж, а начиналось всё с «Почему бы не написать просто и ясно…»
P.S. Всё равно в моём алгоритме сравнений меньше, и работать он будет быстрее :)
Суббота, 29 декабря, 2007 в 11:30 |
Ммм… В моем алгоритме ни одного вызова функции. И говорить, что нечто на дотнете работает быстрее, чем код на сях — нонсенс :)
Суббота, 29 декабря, 2007 в 11:34 |
Ммм… А кто тебе сказал, что это дотнет? Это си, а функции инлайновые.
UPD: И вообще, при чём тут платформы? Я говорил об алгоритмах.
Суббота, 29 декабря, 2007 в 14:00 |
Хо-хо! В алгоритмах не бывает инлайновых функций!
Суббота, 29 декабря, 2007 в 14:36 |
Ну вот привязался! Для особо умных поясню.
1. Алгоритм мой более оптимален благодаря меньшему числу сравнений. И в гробу я видел си и дотнет вместе взятые.
2. Если ты хочешь поговорить о скорости работы моего алгоритма с каким-нибудь компилятором или платформой, то считай, что это код на си и функция IsMultipleOf инлайновая. В этом случае предложенная мной программа будет оптимальнее твоей потому, что см. п.1.
3. Ты и сам всё это прекрасно знаешь, но твоя уязвлённая гордость не позволяет тебе перестать писать свои говнокоменты на этот говнопост :)
Суббота, 29 декабря, 2007 в 15:36 |
Чувак, при чем здесь количество логических операций? Мой код выполнится за меньше число тактов, потому что в нем нет ни одного джампа. А с твоим количеством if-ов у тебя постоянно будет сбрасываться конвейер процессора из-за передачи управления.
И не надо тут говорить, что чья-то там гордость мешает признать чью-то неправоту :)
Суббота, 29 декабря, 2007 в 15:40 |
Такты? Джампы? Конвейер? Кто тебе про них рассказал? Я его ненавижу! :)
UPD: Но абстрагируясь от платформ и аппаратной части мой алгоритм оптимальнее, согласись хотя бы с этим :)
Суббота, 29 декабря, 2007 в 16:32 |
Ммм…
По каким же критериям, черт побери? Я бы и рад это признать, но ты не оставляешь мне выбора этим словом «оптимальнее»! :)
Суббота, 29 декабря, 2007 в 16:36 |
Возьмём частный случай — 2000 год.
Твой алгоритм проверит его на делимость на 4, на 400 и на 100. А мой — только на 400.
Под оптимальностью я подразумевал именно это — меньшее количество проверок :)
Суббота, 29 декабря, 2007 в 17:33 |
В случае 2000 года мой алгоритм получает true на !(year % 400) и заканчивает вычисления. Это Си и дефолтные настройки компилятора :)
Суббота, 29 декабря, 2007 в 17:36 |
Мы же договорились абстрагироваться от платформ/компиляторов :)
Но даже если так, то в случае с 1900 годом у тебя все три проверки сработают :)
Суббота, 29 декабря, 2007 в 17:41 |
Ай ну тебя, таких частных случаев — меньшинство. А для большинства у меня выполнится вот досюда: !(year % 400) || (!(year % 4)
И все.
Гордец! :)
Суббота, 29 декабря, 2007 в 17:46 |
Меньшинство — не меньшинство, а в бесконечном приближении мой алгоритм оптимальнее. И всё.
Упрямый осёл! :)
Суббота, 29 декабря, 2007 в 17:53 |
Ну-ка, ну-ка, докажи про бесконечное приближение. В бесконечном приближении решающее значение будет играть оптимизация для наиболее часто встречающегося случая — а это невисокосный год, не делящийся на 100.
Дилетант! :)
Суббота, 29 декабря, 2007 в 18:03 |
Может про бесконечное приближение я и загнул. Объясняю по-простому.
В твоём алгоритме (а не программе на С) для любого числа выполняются все три проверки.
В моём алгоритме для каждого сотого числа — две, а для каждого четырёхсотого — вообще одна.
Вот и всё.
Суббота, 29 декабря, 2007 в 18:09 |
Товарищ! Любой нормальный человек (абстрагируясь от процессоров, платформ и компиляторов), получив True в левой части оператора нестрогой дизъюнкции, дальше считать не будет. То же, получив False для конъюнкции.
В моем алгоритме для тотально подавляющего большинства чисел выполняются две проверки.
В твоем алгоритме — три.
Вот и все.
Суббота, 29 декабря, 2007 в 18:17 |
Точно! Сцоко, я понял!
Вот самый оптимальный в бесконечном приближении алгоритм:
if (year % 4) return false;
if (!(year % 400)) return true;
return (year % 100);
Суббота, 29 декабря, 2007 в 22:53 |
Вы ебанулись
Воскресенье, 20 января, 2008 в 0:08 |
и че вы хуйней страдаете?
if (year % 4) return false;
if (!(year % 400)) return true;
return true;
Воскресенье, 20 января, 2008 в 0:27 |
function isLeapYear(year){
return (0 == year % 4 && 0 != year % 100) || (0 == year % 400);
}
Понедельник, 21 января, 2008 в 10:32 |
Это кто тут такой ебанутый?
Понедельник, 21 января, 2008 в 10:42 |
По-моему, он ебанулся.
Четверг, 17 марта, 2011 в 16:00 |
Позвольте мне предложить решение
Високосный год определяется по следующему правилу:
Год високосный, если он делится на четыре без остатка, но если он делится на 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;
}
Пятница, 18 марта, 2011 в 10:32 |
Ну да, нармальна так…
Суббота, 13 апреля, 2013 в 1:39 |
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!