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

python mathematics
Сегодня при решении задач на 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. Только при таком образном представление до меня дошло как решаются подобные задачи и как применяется остаток от деления.
Кому интересно, задачки я решаю тут
Опубликованно April 11th, 2018 by Aziz Madazimov
Поделитесь, если Вам понравилось!
Вам так же может понравиться:
Как обратить операцию «остаток от деления»?
Есть выражение x * 6015 % 26 = 4 . Мне необходимо осуществить обратную операцию, чтобы вычислить число x . Пока что реализовал только операцию кодирования, а с декодированием мыслей нет. UPD: Диапазон возможных значений числа x : от 0 до 25
Отслеживать
задан 7 дек 2021 в 10:52
556 1 1 золотой знак 4 4 серебряных знака 22 22 бронзовых знака
14%3 = 2. 47%3 = 2. 2%3 = 2. Это намек: однозначное декодирование не получится.
7 дек 2021 в 10:54
по остатку -никак
7 дек 2021 в 10:54
@Harry, а если я еще знаю возможный диапазон числа x ? К примеру от 0 до 25
7 дек 2021 в 10:56
7 дек 2021 в 10:59
Расширенный алгоритм Евклида решает задачу. Ещё тут: ru.stackoverflow.com/questions/1039660.
7 дек 2021 в 12:29
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Если знаете диапазон, то проще построить карту обратных преобразований и не париться.
numbers_map = # def get_source_number(num): return numbers_map[num]
Отсюда вытекает, что искомое число x = 12 .
Отслеживать
ответ дан 7 дек 2021 в 11:05
13.4k 1 1 золотой знак 8 8 серебряных знаков 23 23 бронзовых знака
Если вас интересует общее решение, то полный перебор — это не то, что вам нужно.
Математически ваша задача формулируется так: найти числа x и y такие, что 6015*x + 26*y = 4
Это уравнение имеет решение, так как эти два числа взаимно просты: gcd(6015, 26) = 1 . Расширенный алгоритм Евклида gcd_extended(A,B) возвращает три числа — gcd(A,B) , u , v такие что A*u + B*v = gcd(A,B)
def gcd_extended(A,B): if A == 0: return (B, 0, 1) _gcd, v, u = gcd_extended(B % A, A) return (_gcd, u - (B // A) * v, v)
g,u,_ = gcd_extended(6015, 26) assert(g == 1) x = 4*u
ответ: x равно 12.
Общий случай
Нужно решить уравнение (x*A)%B = C
Другими словами, нужно решить диофантово уравнение A*x + B*y = C
Это уравнение имеет решение в том и только том случае, если C делится на gcd(A,B) .
Решается так: расширенным алгоритмом Евклида найдем u , v такие, что A*u + B*v = gcd(A,B)
Тогда x = u*C/gcd(A,B)
def invert_mod(A,B,C): "Вернуть x такое, что (A*x)%B = C. Если решения нет, вернуть None." g, u, _ = gcd_extended(A, B) if 0 != (C % g): return None return (u*C//g)%B
В вашем примере invert_mod(6015, 26, 4) вернет 4.
Как узнать остаток при делении в питоне

7. Деление нацело и деление по остатку

8. Функции trunc, floor, ceil

9. Деление нацело и по остатку отрицательных чисел в Python

10. Логический тип Bool. Операции сравнения

11. Cтроки и операции над ними

12. Строки: индексы и срезы

13. Строки и их методы

14. Списки и операции над ними

15. Списки: индексы и срезы
Деление нацело и деление по остатку
Давайте начнем с деления нацело. В Python данная операция обозначается знаком двойного слеша //. И допустим если вам надо нацело поделить a на b (a//b), нужно ответить на вопрос:
«Cколько раз второе число (в нашем случае b) умещается в первое?» (подробности в видео)
И попробуйте посчитать примеры ниже. Нажав на кнопку треугольника вы увидите правильные ответы
Остаток от деления в Python обозначается знаком процента %. Чтобы посчитать, вы должны ответить на вопрос:
«Сколько останется от первого числа после того, как в него максимальное количество раз уместится второе число?»(подробности в видео)
И ниже на примерах проверьте правильно ли вы определяете остаток от деления
Программирование в «Эврике»
Нахождение частного и остатка при делении в Питоне.
1. Целочисленное частное и остаток
// Целочисленное частное от деления левого операнда на правый (то есть результатом вычисления выражения 21 // 5 будет 4).
% Остаток от деления левого операнда на правый (то есть результатом вычисления выражения 21 % 5 будет 1).
Операция деления с округлением вниз (X // Y) всегда усекает дробную часть.
Оглавление
- 1. Целочисленное частное и остаток
Вы используете гостевой доступ (Вход)
Эта страница: General type: incourse. Context Книга: Нахождение частного и остатка при делении в Питоне. (context id 109645). Page type mod-book-view.