Как работает деление модуля

105

Я действительно не понимаю, как работает деление модуля. Я рассчитывал 27 % 16и закончил, 11и я не понимаю почему.

Кажется, я не могу найти в Интернете объяснения в терминах непрофессионала. Может ли кто-нибудь подробно рассказать о том, что здесь происходит?

NSWOA
источник

Ответы:

107

Результатом деления по модулю является остаток от целочисленного деления заданных чисел.

Это значит:

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
Лео
источник
66
пожалуйста, не поймите это неправильно, но ваши примеры ничего не проясняют для тех, кто абсолютно не понимает, что происходит с модульным делением. Вы упустили очень важные шаги, объясняющие, откуда берется этот остаток. Ответ Марчина М. ниже объяснил процесс лучше. Пожалуйста, подумайте о том, чтобы в будущих ответах были более подробны для тех из нас, кто может вообще не понимать концепцию. Тем не менее, спасибо за участие в сообществе! Такие люди, как вы, помогают мне и продолжают помогать мне в моем образовательном путешествии :)
Soundfx4
Несмотря на Википедию, модуль и остаток - это не одно и то же. В некоторых языках есть один, в некоторых - другой, в некоторых - оба, а в некоторых - неопределенный.
Marquis of Lorne
156

Большинство объяснений пропускают один важный шаг, давайте восполним пробел другим примером.

Учитывая следующее:

Dividend: 16
Divisor: 6

Функция модуля выглядит так:

16 % 6 = 4

Давайте выясним, почему это так.

Сначала выполните целочисленное деление , которое похоже на нормальное деление, за исключением того, что любое дробное число (также известное как остаток) отбрасывается:

16 / 6 = 2

Затем умножьте результат вышеуказанного деления ( 2) на наш divisor ( 6):

2 * 6 = 12

Наконец, вычтите результат вышеуказанного умножения ( 12) из нашего дивиденда ( 16):

16 - 12 = 4

Результат этого вычитания 4, то остаток , тот же результат нашего модуля выше!

Марцин М. Джесса
источник
1
Как получить 2 из 16/6, а не 2,6666666667? Должны ли вы всегда просто игнорировать 0, ...? Зачем?
Люк
3
@Luc Как упоминают Лео и ytpillai, мы используем целочисленное деление (где отбрасывается дробная часть результата после деления). В Python 3: 16 // 6 >>> 2и16 / 6 >>> 2.6666666666666665
bryik
30

Возможно, пример с часами поможет вам разобраться в модуле.

Известное применение модульной арифметики - использование 12-часовых часов, в которых день делится на два 12-часовых периода.

Допустим, у нас сейчас это время: 15:00,
но вы также можете сказать, что это 15:00.

Это именно то, что делает modulo:

15 / 12 = 1, remainder 3

Этот пример лучше объяснен в Википедии: Статья в Википедии по модулю

Prine
источник
29

Простая формула для расчета модуля: -

[Dividend-{(Dividend/Divisor)*Divisor}]

Итак, 27% 16: -

27- {(27/16) * 16}

27- {1 * 16}

Ответ = 11

Примечание :

Все вычисления производятся с целыми числами. В случае десятичного частного часть после десятичной точки должна быть проигнорирована / усечена.

например: 27/16 = 1,6875 следует принимать как 1 в приведенной выше формуле. 0,6875 игнорируется.

Компиляторы компьютерных языков обрабатывают целое число с десятичной частью таким же образом (путем усечения после десятичной части).

Code_Jamer
источник
А как насчет 3% 7?
eaglei22 03
Так было бы просто 3?
eaglei22 03
15

Оператор модуля принимает оператор деления и возвращает все, что осталось от этого вычисления, так сказать "оставшиеся" данные, например, 13/5 = 2. Это означает, что осталось 3 или оставшихся от этого вычисления. Зачем? потому что 2 * 5 = 10. Таким образом, 13 - 10 = 3.

Оператор модуля выполняет все эти вычисления за вас, 13% 5 = 3.

RebelPhoenix
источник
Я думаю, что этот ответ лучше всего объясняет это с концептуальной точки зрения. Другие ответы объясняют математически, что также необходимо, но это лучше помогает мне понять, как я могу применить оператор по модулю.
JonnyB
7

деление по модулю просто так: разделить два числа и вернуть только остаток

27/16 = 1, осталось 11, поэтому 27% 16 = 11

то же самое: 43/16 = 2, осталось 11, так что 43% 16 = 11 тоже

Крис
источник
6

Очень просто: a % bопределяется как остаток от деления aна b.

Дополнительные примеры см. В статье в Википедии .

Юваль Адам
источник
5

Хочу еще кое-что добавить:

легко вычислить по модулю, когда дивиденд больше / больше делителя

дивиденд = 5 делитель = 3

5% 3 = 2

3)5(1
  3
-----
  2

а что, если делитель меньше делимого

дивиденд = 3 делитель = 5

3% 5 = 3 ?? как

Это потому, что, поскольку 5 не может делить 3 напрямую, по модулю будет то, что есть дивиденд

млрд долларов
источник
3

Надеюсь, эти простые шаги помогут:

20 % 3 = 2 
  1. 20 / 3 = 6; не включайте .6667- просто игнорируйте
  2. 3 * 6 = 18
  3. 20 - 18 = 2, который является остатком по модулю
Mustafe
источник
Не могли бы вы отформатировать этот ответ немного лучше?
Code Maverick
Проверьте ответ Code Jammer.
Аджмал Салим
2

Проще, если ваше число после десятичной дроби (0.xxx) будет коротким. Затем все, что вам нужно сделать, это умножить это число на число после деления.

Пример: 32 % 12 = 8

Вы делаете 32/12=2.666666667 Затем вы выбрасываете 2и сосредотачиваетесь на 0.666666667 0.666666667*12=8<- Это ваш ответ.

(опять же, это просто, когда число после десятичной дроби короткое)

Gc220
источник
1

Деление по модулю дает вам остаток от деления, а не частное.

самоз
источник
1

Допустим, у вас 17 мод 6.

какое общее число 6 даст вам самое близкое к 17, это будет 12, потому что если вы перейдете к 12, у вас будет 18, что больше, чем вопрос о 17 по модулю 6. Затем вы возьмете 12 и минус из 17, что даст вам ваш ответ, в данном случае 5.

17 мод 6 = 5

Чад Финч
источник
1

Деление модуля довольно просто. Вместо частного используется остаток.

    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}

В этом свете модуль упругости, а также его использование становятся намного яснее.

Брейден Бест
источник
1

Единственное, что важно понять, это то, что модуль (обозначенный здесь%, как в 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

Как было сказано ранее, просто запомните инвариант , то есть евклидово деление .

Дальнейшие подробности:

Пико Винсент
источник
1
Удивительно полезно в отношении нумерации страниц.
Боб Джордан
1

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.

Уильям
источник
0

Это просто, оператор модуля (%) возвращает остаток после целочисленного деления. Возьмем, к примеру, ваш вопрос. Как 27% 16 = 11? Когда вы просто разделите 27 на 16, то есть (27/16), вы получите остаток как 11, и поэтому ваш ответ - 11.

Шираз Шреста
источник
0

Напишите таблицу, начинающуюся с 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). Другой модуль, другая таблица. Подумайте о хэш-таблице.

Терренс Маклафлин
источник
0

Когда мы разделим два целых числа, мы получим уравнение, которое выглядит следующим образом:

A / B = Q остаток R

A - дивиденд; 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 - количеством слотов или ключом, в который вставлен элемент.

Для получения дополнительной информации см. Как работает хеш-таблица.

Йогендра Паудьял
источник
-1

Для меня это был лучший подход к пониманию оператора модуля. Я просто объясню вам на примерах.

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

Немус
источник