Как работает модуль деления
Я не очень понимаю, как работает разделение модулей. Я подсчитывал 27 % 16
и завелся 11
и я не понимаю почему.
Я не могу найти объяснение в терминах непрофессионала онлайн. Может ли кто-нибудь подробно рассказать о том, что здесь происходит?
17 ответов
Результатом деления по модулю является остаток от целочисленного деления данных чисел.
Это означает:
27 / 16 = 1, remainder 11
=> 27 mod 16 = 11
Другие примеры:
30 / 3 = 10, remainder 0
=> 30 mod 3 = 0
35 / 3 = 11, remainder 2
=> 35 mod 3 = 2
В большинстве объяснений пропущен один важный шаг, давайте восполним пробел на другом примере.
Учитывая следующее:
Dividend: 16
Divisor: 6
Функция модуля выглядит следующим образом:
16 % 6 = 4
Давайте определимся, почему это так.
Сначала выполните целочисленное деление, которое аналогично обычному делению, за исключением того, что любое дробное число (иначе остаток) отбрасывается:
16 / 6 = 2
Затем умножьте результат вышеупомянутого деления (2
) с нашим делителем (6
):
2 * 6 = 12
Наконец, вычтите результат вышеупомянутого умножения (12
) от нашего дивиденда (16
):
16 - 12 = 4
Результат этого вычитания, 4
, остаток, является тем же самым результатом нашего модуля выше!
Простая формула для расчета модуля:
[Dividend-{(Dividend/Divisor)*Divisor}]
Итак, 27% 16: -
27- {(27/16) * 16}
27- {1 * 16}
Ответ = 11
Примечание:
Все расчеты с целыми числами. В случае десятичного отношения, часть после десятичного знака должна быть проигнорирована / усечена.
например: 27/16= 1,6875 следует принимать как 1 в приведенной выше формуле. 0.6875 игнорируется.
Компиляторы компьютерных языков обрабатывают целое число с десятичной частью так же (путем усечения после десятичной)
Может быть, пример с часами поможет вам понять по модулю.
Знакомое использование модульной арифметики - это ее использование в 12-часовых часах, когда день делится на два 12-часовых периода.
Допустим, у нас на этот раз уже 15:00
Но вы также можете сказать, что это 3 часа дня
Это именно то, что делает по модулю:
15 / 12 = 1, remainder 3
Вы найдете этот пример лучше объясненным в Википедии: Wikipedia Modulo Article
Оператор модуля принимает оператор деления и возвращает то, что осталось от этого вычисления, так называемые "оставшиеся" данные, такие как 13 / 5 = 2. Это означает, что осталось 3 или осталось от этого вычисления. Зачем? потому что 2 * 5 = 10. Таким образом, 13 - 10 = 3.
Оператор модуля делает все эти вычисления за вас, 13 % 5 = 3.
Деление модуля просто так: разделить два числа и вернуть только остаток
27 / 16 = 1 с 11 осталось, поэтому 27 % 16 = 11
То же самое 43 / 16 = 2 с 11 оставшимися так 43 % 16 = 11 также
Очень просто: a % b
определяется как остаток от деления a
от b
,
См. Статью в Википедии для большего количества примеров.
Я хотел бы добавить еще одну вещь:
легко вычислить по модулю, когда дивиденд больше / больше делителя
дивиденд = 5 делитель = 3
5% 3 = 2
3)5(1
3
-----
2
но что, если делитель меньше, чем дивиденд
дивиденд = 3 делитель = 5
3% 5 = 3 как
Это связано с тем, что, поскольку 5 не может делить 3 напрямую, по модулю будет получаться дивиденд
27 % 16 = 11
Вы можете интерпретировать это так:
16 идет 1 раз в 27 перед тем, как пройти.
16 * 2 = 32.
Таким образом, можно сказать, что 16 идет один раз из 27 с остатком 11.
По факту,
16 + 11 = 27
Другой пример:
20% 3 = 2
Лунка 3 проходит 6 раз в 20 перед тем, как пройти.
3 * 6 = 18
Чтобы сложить до 20, нам нужно 2, поэтому остаток выражения модуля равен 2.
Я надеюсь, что эти простые шаги помогут:
20 % 3 = 2
20 / 3 = 6
; не включать.6667
- просто игнорируй это3 * 6 = 18
20 - 18 = 2
, который является остатком по модулю
Проще, когда ваш номер после запятой (0.xxx) короткий. Тогда все, что вам нужно сделать, это умножить это число на число после деления.
Пример: 32 % 12 = 8
Ты сделаешь 32/12=2.666666667
Затем вы бросаете 2
прочь и сосредоточиться на 0.666666667
0.666666667*12=8
<- Это твой ответ.
(опять же, легко, только если число после десятичной точки короткое)
Единственная важная вещь для понимания - это то, что модуль (обозначаемый здесь как%, как в C) определяется через евклидово деление.
Для любых двух (d, q)
целые числа всегда верно:
d = ( d / q ) * q + ( d % q )
Как вы можете видеть значение d%q
зависит от стоимости d/q
, Вообще для натуральных чисел d/q
усекается до нуля, например, 5/2 дает 2, следовательно:
5 = (5/2)*2 + (5%2) => 5 = 2*2 + (5%2) => 5%2 = 1
Однако для отрицательных целых чисел ситуация менее ясна и зависит от языка и / или стандарта. Например, -5/2 может возвращать -2 (обрезается до нуля, как и раньше), но также может возвращать -3 (с другим языком).
В первом случае:
-5 = (-5/2)*2 + (-5%2) => -5 = -2*2 + (-5%2) => -5%2 = -1
но во втором:
-5 = (-5/2)*2 + (-5%2) => -5 = -3*2 + (-5%2) => -5%2 = +1
Как сказано выше, просто запомните инвариант, который является евклидовым делением.
Более подробная информация:
Все просто, оператор модуля (%) возвращает остаток после целочисленного деления. Давайте возьмем пример вашего вопроса. Как 27 % 16 = 11? Когда вы просто делите 27 на 16, т.е. (27/16), вы получаете остаток как 11, и поэтому ваш ответ - 11.
Допустим, у вас есть 17 мод 6.
из того, что из 6 вы получите ближайший к 17, это будет 12, потому что если вы пройдете более 12, у вас будет 18, что больше, чем вопрос 17 мода 6. Затем вы возьмете 12 и минус 17, что даст вам ваш ответ, в данном случае 5.
17 мод 6=5
Модуль деления довольно прост. Он использует остаток вместо частного.
1.0833... <-- Quotient
__
12|13
12
1 <-- Remainder
1.00 <-- Remainder can be used to find decimal values
.96
.040
.036
.0040 <-- remainder of 4 starts repeating here, so the quotient is 1.083333...
13/12 = 1R1, следовательно 13%12 = 1.
Это помогает думать о модуле как о "цикле".
Другими словами, для выражения n % 12
, результат всегда будет < 12.
Это означает, что последовательность для набора 0..100
за n % 12
является:
{0,1,2,3,4,5,6,7,8,9,10,11,0,1,2,3,4,5,6,7,8,9,10,11,0,[...],4}
В этом свете модуль, как и его использование, становится намного понятнее.
Запишите таблицу, начиная с 0.
{0,1,2,3,4}
Продолжайте таблицу в строках.
{0,1,2,3,4}
{5,6,7,8,9}
{10,11,12,13,14}
Все в столбце 1 кратно 5. Все в столбце 2 кратно 5 с 1 в качестве остатка. Теперь абстрактная часть: Вы можете записать это (1) как 1/5 или как десятичное расширение. Оператор модуля возвращает только столбец или, иначе говоря, возвращает остаток от длинного деления. Вы имеете дело с модулем (5). Другой модуль, другой стол. Подумайте о хэш-таблице.
Когда мы разделим два целых числа, мы получим уравнение, которое выглядит следующим образом:
A / B =Q остаток R
А - дивиденд; B - делитель; Q является частным, а R является остатком
Иногда нас интересует только то, что является остатком, когда мы делим A на B. Для этих случаев есть оператор, называемый оператором по модулю (сокращенно как mod).
Примеры
16/5= 3 Remainder 1 i.e 16 Mod 5 is 1.
0/5= 0 Remainder 0 i.e 0 Mod 5 is 0.
-14/5= 3 Remainder 1 i.e. -14 Mod 5 is 1.
См. Статью Академии Хана для получения дополнительной информации.
В области информатики в хэш-таблице используется оператор Mod для хранения элемента, где A будет значением после хэширования, B будет размером таблицы, а R - числом слотов или ключом, в который вставлен элемент.
Посмотрите, как работает хеш-таблица для получения дополнительной информации
Для меня это был лучший подход для понимания оператора модуля. Я просто объясню вам на примерах.
16 % 3
Когда вы делите эти два числа, остаток является результатом. Это способ, как я это делаю.
16 % 3 = 3 + 3 = 6; 6 + 3 = 9; 9 + 3 = 12; 12 + 3 = 15
Так что осталось до 16 это 1
16 % 3 = 1
Вот еще один пример: 16 % 7 = 7 + 7 = 14
что осталось до 16? Является 2
16 % 7 = 2
Еще один: 24 % 6 = 6 + 6 = 12; 12 + 6 = 18; 18 + 6 = 24
, Итак, остаток равен нулю, 24 % 6 = 0