Как прийти к такому решению? Задача: найти количество високосных лет между двумя датами, не используя циклы. Я методом "тыка" решил по такой формуле. По крайней мере выходные значения совпали: years = ((last_year / 4) % 100 + (last_year / 400)) - ((start_year / 4) % 100 + (start_year / 400)); Потом ещё подглядел вот такое решение, видимо оно правильнее: ((last_year / 4) - (last_year / 100) + (last_year / 400)) - ((start_year / 4) - (start_year / 100) + (start_year / 400)); Вот не могу понять как прийти к такому решению логически, где взаимосвязь? Зачем сначала делить на 4 потом делить на 100 потом на 400 прибавлять вычитать? Если не лень, объясните пожалуйста.
Для того чтобы понять логику данного решения, нужно разобраться в правилах определения високосного года. В Григорианском календаре високосный год определяется следующим образом:
Год, который делится на 4 без остатка, является високосным годом.Однако год, который делится на 100 без остатка, не является високосным годом.Если год делится на 400 без остатка, то такой год все-таки является високосным.
Здесь первая часть ((last_year / 4) % 100) - это количество лет, делящихся на 4 без остатка в заданном диапазоне лет, а вторая часть ((last_year / 400)) - это количество лет, делящихся на 400 без остатка в заданном диапазоне лет. Таким образом, мы учитываем все високосные годы в заданном диапазоне.
Здесь также учитывается количество лет, делящихся на 4 без остатка и на 400 без остатка, но также вычитается количество лет, делящихся на 100 без остатка, чтобы учесть годы, которые не являются високосными в соответствии со вторым правилом.
Таким образом, оба решения правильны, но второе более точно учитывает правила определения високосного года.
Для того чтобы понять логику данного решения, нужно разобраться в правилах определения високосного года. В Григорианском календаре високосный год определяется следующим образом:
Год, который делится на 4 без остатка, является високосным годом.Однако год, который делится на 100 без остатка, не является високосным годом.Если год делится на 400 без остатка, то такой год все-таки является високосным.Теперь разберем логику вашего первого решения:
((last_year / 4) % 100 + (last_year / 400)) - ((start_year / 4) % 100 + (start_year / 400))
Здесь первая часть ((last_year / 4) % 100) - это количество лет, делящихся на 4 без остатка в заданном диапазоне лет, а вторая часть ((last_year / 400)) - это количество лет, делящихся на 400 без остатка в заданном диапазоне лет. Таким образом, мы учитываем все високосные годы в заданном диапазоне.
В вашем втором решении:
((last_year / 4) - (last_year / 100) + (last_year / 400)) - ((start_year / 4) - (start_year / 100) + (start_year / 400))
Здесь также учитывается количество лет, делящихся на 4 без остатка и на 400 без остатка, но также вычитается количество лет, делящихся на 100 без остатка, чтобы учесть годы, которые не являются високосными в соответствии со вторым правилом.
Таким образом, оба решения правильны, но второе более точно учитывает правила определения високосного года.