Как прийти к такому решению? Задача: найти количество високосных лет между двумя датами, не используя циклы.
Я методом "тыка" решил по такой формуле. По крайней мере выходные значения совпали:
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 прибавлять вычитать?
Если не лень, объясните пожалуйста.

21 Авг 2019 в 06:20
272 +1
0
Ответы
1

Для того чтобы понять логику данного решения, нужно разобраться в правилах определения високосного года. В Григорианском календаре високосный год определяется следующим образом:

Год, который делится на 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 без остатка, чтобы учесть годы, которые не являются високосными в соответствии со вторым правилом.

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

20 Апр в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 134 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир