Подтвердить что ты не робот

Расчет високосного года

Чтобы найти високосные годы, почему год должен быть неделим на 100 и делиться на 400?

Я понимаю, почему он должен делиться на 4. Пожалуйста, объясните алгоритм.

4b9b3361

Ответ 1

Продолжительность года (более или менее) 365.242196 дней. Поэтому нам нужно вычесть более или менее четверть дня, чтобы он соответствовал:

365.242196 - 0.25 = 364.992196 (добавив 1 день через 4 года): но упс, теперь это слишком мало!! позволяет добавить hundreth дня (не добавляя этот день один раз в сто лет: -))

364.992196 + 0,01 = 365.002196 (oops, немного слишком большой, пусть в этот же день добавляется этот день в течение примерно 400 лет)

365.002196 - 1/400 = 364.999696

Почти сейчас, просто играйте с leapseconds время от времени, и вы настроены.

(Примечание: причина, по которой после этого шага больше не исправляются, потому что год также ИЗМЕНЕН В ДЛИНОЙ!!, почему leapseconds являются наиболее гибким решением, см., например, здесь)

Вот почему я думаю

Ответ 2

Существует алгоритм wikipedia для определения високосных лет:

function isLeapYear (year):
    if ((year modulo 4 is 0) and (year modulo 100 is not 0))
    or (year modulo 400 is 0)
        then true
    else false

Там много информации об этой теме на странице википедии о високосных годах, включая информацию о разных календарях.

Ответ 3

В общих чертах алгоритм вычисления високосного года выглядит следующим образом:

Год будет високосным годом, если он будет делиться на 4, но не на 100. Если год делится на 4 и на 100, это не високосный год, если он также не делится на 400.

Таким образом, такие годы, как 1996, 1992, 1988 и т.д., представляют собой високосные годы, потому что они делятся на 4, но не на 100. В течение столетий правило 400 имеет важное значение. Таким образом, столетие 1900, 1800 и 1700 гг., А все еще делящиеся на 4, также точно делятся на 100. Поскольку они не делятся на 400, они не являются високосных годами.

Ответ 4

этого достаточно, чтобы проверить, год ли високосный год.

if( (year%400==0 || year%100!=0) &&(year%4==0))
    cout<<"It is a leap year";
else
    cout<<"It is not a leap year";

Ответ 5

а) Год составляет 365,242199 дней.

б) Если бы каждый год составлял 365 дней, через 100 лет мы потеряли бы 24,2199 дней. Вот почему мы прибавляем 24 дня в столетие (каждые 4 года, КРОМЕ делимого на 100)

в) Но все равно мы теряем 0,21299 дней/век. Таким образом, за 4 века мы теряем 0,8796 дней. Поэтому мы добавляем 1 день на 4 века (каждый четвертый век мы считаем високосным годом).

г) Но это означает, что мы теряем -0. 1204 дня (мы идем вперед) за четырехлетие (4 века). Таким образом, в 8 четырехлетии (3200 лет) мы не считаем високосный год.

д) Но это означает, что мы теряем 0,0368 дней на 3200 лет. Таким образом, за 24x3200 лет (= 76800 лет) мы теряем 0,8832 дня. Вот почему мы считаем високосный год.

и так далее... (к тому времени мы уничтожим планету, так что это не имеет значения)

Однако я не могу понять, почему мы не считаем високосный год каждые 500 лет вместо 400. Таким образом, мы быстрее сходимся к правильному времени (мы потеряли бы 2,3 часа /500 лет).

Ответ 6

Я уверен, что Wikipedia может объяснить это лучше, чем я могу, но в основном это связано с тем, что если вы добавили дополнительный день каждые четыре года мы будем опережать солнце, поскольку его время на орбиту на солнце составляет менее 365,25 дней, поэтому мы компенсируем это, не добавляя високосных дней в годы, которые не делятся на 400, например, 1900.

Надеюсь, что поможет

Ответ 7

Вот простая реализация алгоритма Википедии с использованием троичного оператора javascript:

isLeapYear = (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);

Ответ 8

Верните true, если входной год представляет собой високосный год

Основной современный код дня:

  If year mod 4 = 0, then leap year
  if year mod 100 then normal year
  if year mod 400 then leap year
  else normal year

Сегодняшнее правило началось в 1582 году нашей эры. Правило юлианского календаря с каждым 4-м годом начиналось с 46 г. до н.э., но не является связным до 10 г. н.э. Тем не менее, они добавляли несколько високосных лет каждый третий год, а затем и в предыдущие годы: Поэтому високосные годы были 45 г. до н.э., 42 г. до н.э., 39 г. до н.э., 33 г. до н.э., 30 г. до н.э., 27 г. до н.э., 24 г. до н.э., 18 г. до н.э., 15 г. до н.э., 12 г. до н.э., 9 г. до н.э., 8 г. н.э., 12 г. н.э. До года 45BC високосный год не добавлялся.

Год 0 не существует таким, какой он есть... 2BC 1BC 1AD 2AD... для некоторых расчетов это может быть проблемой.

function isLeapYear(year: Integer): Boolean;
begin
  result := false;
  if year > 1582 then // Todays calendar rule was started in year 1582 
    result := ((year mod 4 = 0) and (not(year mod 100 = 0))) or (year mod 400 = 0)
  else if year > 10 then // Between year 10 and year 1582 every 4th year was a leap year 
    result := year mod 4 = 0
  else //Between year -45 and year 10 only certain years was leap year, every 3rd year but the entire time
    case year of
      -45, -42, -39, -36, -33, -30, -27, -24, -21, -18, -15, -12, -9:
        result := true;
    end;
end;

Ответ 10

Не будет ли намного лучше, если мы сделаем еще один шаг. Предполагая, что каждый 3200 год не будет високосного года, длина года придет

364.999696 + 1/3200 = 364.999696 + .0003125 = 365.0000085

и после этого настройка потребуется примерно через 120000 лет.

Ответ 11

В Java Ниже код вычисляет число високосного года между двумя данными годами. Определите начальную и конечную точку цикла.

Тогда, если параметр modulo 4 равен 0, а параметр modulo 100 не равен 0 или параметр по модулю 400 равен нулю, то это високосный год и счетчик увеличения.

static int calculateLeapYearCount(int year, int startingYear) {
        int min = Math.min(year, startingYear);
        int max = Math.max(year, startingYear);
        int counter = 0;
        for (int i = min; i < max; i++) {
            if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
                counter = counter + 1;
            }
        }
        return counter;
    }

Ответ 12

PHP:

// is number of days in the year 366?  (php days of year is 0 based)
return ((int)date('z', strtotime('Dec 31')) === 365);

Ответ 13

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

Я имею в виду, что каждый год может быть високосный год, и у нас будет дополнительная неделя в эти високосные годы... но силы, которые будут решаться сделать это каждый день каждые 4 года, чтобы наверстать упущенное.

Это также связано с тем, что земля задерживает 365,25 дней, чтобы обойти солнце и т.д. Конечно, это не совсем 365,25, это немного меньше (365.242222...), поэтому чтобы исправить это расхождение, они решили отказаться от високосных лет, которые делятся на 100.

Ответ 14

Если вас интересуют причины этих правил, это потому, что время, затрачиваемое землей на одну орбиту вокруг Солнца, - это длинное неточное десятичное значение. Это не совсем 365,25. Это немного меньше 365,25, поэтому каждые 100 лет, один високосный день должны быть устранены (365,25-0,01 = 365,24). Но это не совсем правильно. Значение немного больше 365,24. Таким образом, только 3 из 4-х раз будут применять правило 100 лет (или, другими словами, добавить обратно в 1 день каждые 400 лет, 365,25-0,01 + 0,0025 = 365,2425).

Ответ 15

В настоящее время в среднем в среднем составляет 365,2425 дней в году (Земля замедляется, но пока игнорирует это).

Причина, по которой мы имеем високосные годы каждые 4 года, состоит в том, что это приводит нас к 365,25 в среднем [(365+365+365+366) / 4 = 365.25, 1461 days in 4 years].

Причина, по которой у нас нет високосных лет на 100-кратных, заключается в том, чтобы довести нас до 365,24 `[(1461 x 25 - 1)/100 = 365,24, 36 524 дней за 100 лет.

Тогда причина, по которой мы снова имеем високосный год на 400-кратных, - это получить нас до 365.2425 [(36,524 x 4 + 1) / 400 = 365.2425, 146,097 days in 400 years].

Я считаю, что может быть еще одно правило с 3600-кратным, но я никогда не кодировал его (Y2K было одной вещью, но планирование на полторы тысячи лет в будущем не нужно, на мой взгляд, - помните, что я раньше было не так.

Таким образом, правила уменьшают приоритет:

  • Несколько 400 - это високосный год.
  • кратное 100 не является високосным годом.
  • кратное 4 - это високосный год.
  • что-нибудь еще не високосный год.

Ответ 16

Здесь идет довольно мрачная идея. Когда каждый год, делящийся на 100, получает 365 дней, что должно быть сделано в это время? В далеком будущем, когда даже годы, делящиеся с 400, могут получить только 365 дней.

Тогда есть возможность или повод внести исправления в годы, делящиеся с 80. Нормальные годы будут иметь 365 дней, а те, которые могут быть с 400, могут получить 366 дней. Или это бесшумная ситуация.

Ответ 17

Вы можете просто проверить, делится ли число Year на 4 и 400. Вам действительно не нужно проверять, является ли оно неделимым на 100. Причина 400 ставится под сомнение, потому что согласно Григорианскому календарю наша "длина дня" "немного отстал, и, таким образом, чтобы компенсировать это, у нас есть 303 регулярных года (365 дней каждый) и 97 високосных лет (366 дней каждый). Разница этих трех дополнительных лет, которые не високосные годы, заключается в том, чтобы оставаться в цикле с григорианским календарем, который повторяется каждые 400 лет. Посмотрите на уравнение конгруэнции Кэша Целлера. Это поможет понять настоящую причину. Надеюсь, это поможет:)

Ответ 18

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

Ответ 19

Python 3.5

def is_leap_baby(year):
    if ((year % 4 is 0) and (year % 100 is not 0)) or (year % 400 is 0):
        return "{0}, {1} is a leap year".format(True, year)
    return "{0} is not a leap year".format(year)

print(is_leap_baby(2014))
print(is_leap_baby(2012))

Ответ 20

Просто потому, что 2000 год является високосным, он делится на 100 и делится на 4. Поэтому, чтобы гарантировать, что это правильный скачок, нам нужно убедиться, что он делится на 400. 2000% 4 = 0 2000% 100 = 0 Согласно алгоритму не скачок, но он делится на 400 2000% 400 = 0, так что это скачок.

Ответ 21

Я нашел эту проблему в книге "Иллюстрированное руководство по Python 3". Это было в очень ранней главе, в которой обсуждались только математические операции, ни циклов, ни сравнений, ни условных выражений. Как вы можете определить, является ли данный год високосным?

Ниже то, что я придумал:

y = y % 400
a = y % 4
b = y % 100
c = y // 100
ly = (0**a) * ((1-(0**b)) + 0**c)   # ly is not zero for leap years, else 0

Ответ 22

Это наиболее эффективный способ, я думаю.

Python:

def leap(n):
    if n % 100 == 0:
        n = n / 100
    return n % 4 == 0

Ответ 23

Реализация на С#

public bool LeapYear()
{
     int year = 2016;

     return year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ;
}

Ответ 24

просто написал это в Coffee- Script:

is_leap_year = ( year ) ->
  assert isa_integer year
  return true   if year % 400 == 0
  return false  if year % 100 == 0
  return true   if year %   4 == 0
  return false

# parseInt? that not even a word. 
# Let rewrite that using real language:
integer = parseInt 

isa_number = ( x ) ->
  return Object.prototype.toString.call( x ) == '[object Number]' and not isNaN( x )

isa_integer = ( x ) ->
  return ( isa_number x ) and ( x == integer( x ) )

конечно, проверка достоверности, сделанная здесь, идет немного дальше, чем того, о чем просили, но я считаю необходимым заняться хорошим программированием.

обратите внимание, что возвращаемые значения этой функции указывают на високосные годы в так называемом пролептическом gregorian календаре, поэтому на 1400 год он указывает false, тогда как на самом деле этот год был високосным годом, согласно используемому тогда юлианский календарь. я все равно оставлю его как таковой в библиотеке datetime, которую я пишу, потому что при написании правильного кода, чтобы иметь дело с датами, быстро становится неожиданно задействовано, поэтому я буду поддерживать только gregorian calendar (или заплатить за другой).