Двоичные мысли интерпретация

Остаток от деления

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

Дано число n. С начала суток прошло n минут. Определите, сколько часов и минут будут показывать электронные часы в этот момент. Программа должна вывести два числа: количество часов (от 0 до 23) и количество минут (от 0 до 59). Учтите, что число n может быть больше, чем количество минут в сутках.

Я написал простенький код

n = int(input()) # Присваеваем переменной n функцию input(), которая будет получать значение минут 
hours = int(n//60) # Присваеваем переменной hours целое частное от деления заданных минут на 60 получая значение часов
minutes = init(n%60) # Присваеваем переменной minutes остаток от деления заданных минут на 60 получая значение минут
print(hours, minutes) # Функцией print() выводим на экран значения hours и minutes

Данное значение в 150 минут программка показала правильно выдав значение 2 часа и 30 минут. Но вот с остальными тестовыми данными ее ждал провал. Во первых она не показывала 00 часов, а вместо это выдавала 24 часа. Ну и во вторых если ей давалось исходное значение больше \( 24*60 \) минут то мои написанные часы могли показать и 30 часов 5 минут и так далее. Естественно это была ошибка и код не работал как следует. Я не понимал как заставить их правильно считать часы, в голову лезли лишь условные операторы, но по теме я их еще не проходил. Тогда я подсмотрел решение, оно оказалось очень простым.

Остаток от деления большего числа на меньшее

С остатком от деления большего числа на меньшее у меня проблем не было, я прекрасно представлял себе как это работает. Возьмем для примера 5 вкусных апельсинов как на фото и разделим их на пятерых друзей, важное условие чтобы каждый получил целый апельсин. Тут все просто \( 5/5=1 \) апельсин на человека, при этом у нас не остается апельсинов, так как мы все раздали. Т.е. остаток у нас 0. А если бы нам нужно было поделить 5 апельсинов на двоих, сохраняя при этом условие, что каждый должен получить только целые апельсины. \( 5/2=2 \) целых апельсина, и \( 5-2*2=1 \) апельсин в остатке. (Если ты это читаешь, то я уже знаю, что если бы мне пришлось делить апельсины с тобой, то тебе бы дасталось 5, а мне 0 и при этом считалось бы поровну.)

Остаток от деления меньшего числа на большее

Когда полез гуглить и обнаружилось, что это материал третьего класса математики стало стыдно. То ли я забыл этот материал, то ли сказывается то, что давно не занимался, то ли я вообще этого не знал. Мысленно обратимся снова к апельсинам. Теперь нужно поделить 5 апельсинов на 10 человек! Как? Поделить каждый апельсин пополам и каждому раздать половинку. \( 5/(1/2)/10=1 \) как показывает пример каждый получает по 1/2, т.е. половине апельсина. Но! По нашему условию каждый то должен был получить обязательно по целому апельсину, а никак не по половине. Так как разделить 5 апельсинов на 10 человек, чтобы каждый получил целый апельсин? Правильно, никак. Каждый получает 0 апельсинов, а в остатке у нас остается так же 5 апельсинов. Теперь зная это уже можно поменять код для получения часа:

hours = int(n//60%24) 
# n // 60 - делим заданное количество минут на 60 минут, выполняем целочисленное деление, чтобы получить количество целых часов без дробной части
# получаем остаток от деления полученного количества часов  n // 60 на 24 (количество часов в сутках)

Как работает код. Допустим нужно определить какое время покажут часы когда с начала суток пройдет 8952 часа. 1. \( 8952/60=149,2 \) но мы выполняем целочисленное деление и соответственно результатом будет просто 149 2. \( 149/24 \) нам нужен остаток от деления, нацело не делится, получается 6 целых и \( 149-24 * 6=5 \) остаток.   Т.е. получается часовая стрелка сделает 6 полных оборотов, т.е. пройдет 6 суток и еще 5 часов. На часах будет 5 часов. Теперь найдем сколько покажут минут наши часы, для этого нам нужен остаток от деления данных минут на 60.Мы уже находили целое число от деления, подставив его найдем остаток \( 8952-149 * 60=12 \) минут. Весь код будет выглядеть так:

n = int(input()) 
hours = int(n//60%24)
minutes = int(n%60)
print(hours, minutes)

Что произойдет если количества заданных минут при пересчете на часы будет меньше 24? Будет как раз таки нахождение остатка от деления меньшего числа на большее, которое я не знал и которое сбило меня с толку. Т.е. Возьмем на входе 150 минут. Целочисленное деление 150 на 60 даёт нам 2 часа. Теперь находим остаток от деления 2 на 24, как и в случае с апельсинами остаток останется 2, так как мы не можем цело поделить 2 на 24. В условии есть еще что программа должа определять часы от 0 до 23, а минуты от 0 до 59. Вы наверное уже догадались почему в результате у нас никак не может получится 24 часа или 60 минут. Поясняю. Берем значение в 1440 минут. Находим целочисленное от деления 1440 на 60, оно равно 24. Далее вычисляем остаток от деления 24 на 24, он получается равным 0, как и в случае когда мы 5 апельсинов делили на 5 человек, мы отдали все и у нас ничего не осталось. Поэтому наши часы покажут 0 вместо 24. Только при таком образном представление до меня дошло как решаются подобные задачи и как применяется остаток от деления.

Кому интересно, задачки я решаю тут

Поделитесь, если Вам понравилось!