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

Прошу прощения, если это простой вопрос, но мне трудно понять концепцию модульного деления, когда первое число меньше второго. Например, когда 1% 4 моя книга говорит, что остаток равен 1. Я не понимаю, как 1 является остатком от 1% 4.
1/4 составляет 0,25. Я неправильно думаю о делении модуля?


person Jessica M.    schedule 01.05.2013    source источник


Ответы (6)


Во-первых, в Java% - это оператор остатка (не по модулю), семантика которого немного отличается. Тем не менее, вы должны мыслить в терминах деления только на целые числа, как если бы не было дробных значений. Думайте об этом как о хранении элементов, которые нельзя разделить: вы можете хранить ноль элементов размера 4 в хранилище общей емкостью один. Ваша оставшаяся емкость после хранения максимального количества элементов равна единице. Точно так же 13% 5 равно 3, так как вы можете уместить 2 полных элемента размера 5 в хранилище размера 13, а оставшаяся емкость составляет 13 - 2*5 = 3.

person misberner    schedule 01.05.2013
comment
Я понимаю деление остатка, когда первое число больше второго. Итак, я понимаю, что 13% 5 равно 3. Я не понимаю, каков будет ответ, если 5% 13. - person Jessica M.; 01.05.2013
comment
Если ваш предмет больше вашей вместимости, вы никогда не сможете поместить его в свое хранилище. Следовательно, результатом ВСЕГДА является ваша общая емкость, которая остается неиспользованной (т.е. первое число - вы, вероятно, имели в виду 5 % 13) - person misberner; 01.05.2013
comment
Да, я имел в виду 5% 13, а не наоборот. Итак, если я понимаю, что вы говорите, ответ на 5% 13 будет 5? Это правильно? - person Jessica M.; 01.05.2013
comment
Его также называют оператором по модулю! - person Ravi Trivedi; 01.05.2013
comment
@Ravi: Это неправда, есть разница между модулем и остатком (см., Например, blogs.msdn.com/b/ericlippert/archive/2011/12/05/). Это влияет на то, следует ли знак результата за делимым или за делителем в случае отрицательных значений. Оператор Javas% реализует остальную семантику. - person misberner; 01.05.2013
comment
@misberner, в java это точно называется по модулю. То, что вы говорите, верно только в том, что касается мира математики. - person Ravi Trivedi; 01.05.2013
comment
@Ravi, вы определенно ошибаетесь (если вы берете Oracle за образец), отметьте docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html - person misberner; 01.05.2013
comment
@misberner, хм, так что это не официальный термин. Спасибо за это исх. - person Ravi Trivedi; 01.05.2013
comment
@Ravi, пожалуйста, я только недавно обнаружил это для себя, когда я наткнулся на несоответствие между решателем ограничений и семантикой Java при работе с отрицательными значениями (и обнаружил, что решатель ограничений поддерживает операторы MOD и REM). В C / C ++%, насколько мне известно, является оператором модуля, но вы можете легко убедиться, что поведение между версиями% для C / C ++ и Java различается, когда задействованы отрицательные операнды. - person misberner; 01.05.2013
comment
Я не считаю себя вправе утверждать, что их нельзя менять местами, но различие в официальных документах является достаточным основанием полагать, что их не следует менять местами. См., Например, docs.oracle.com/javase / 7 / docs / technotes / guides / language /, раздел Внутренние инварианты: ... поскольку оператор% не является истинным оператором модуля, но вычисляет остаток ... - person misberner; 09.06.2015
comment
@misberner Давайте согласимся в одном: в Java нет оператора модуля, только оператор остатка % - person MaxZoom; 09.06.2015
comment
Результат - первый номер. К примеру 3567 мод 9886789 = 3567 - person Java; 29.05.2020

Если вы разделите 1 на 4, вы получите 0 с остатком 1. Это все, что есть модуль, остаток после деления.

person Jean-Bernard Pellerin    schedule 01.05.2013
comment
Что будет если 40% 160 - person Vinay Shukla; 29.11.2014
comment
@yanivx то же самое, 0 остаток 40, поэтому ответ 40 - person Jean-Bernard Pellerin; 01.12.2014

Я собираюсь добавить более практический пример к тому, что уже сказал Жан-Бернар Пеллерен.

Это правильно, если вы разделите 1 на 4, вы получите 0, но почему, когда вы делаете 1% 4, вы получаете 1 в результате?

В основном это потому, что это:

n = a / b (integer), and
m = a % b = a - ( b * n )

So,

 a    b    n = a/b  b * n  m = a%b
 1    4      0        0      1    
 2    4      0        0      2
 3    4      0        0      3
 4    4      1        0      0
 5    4      1        4      1

Заключение: пока a ‹b, результатом a% b будет« a »

person Jorge Casariego    schedule 13.02.2017
comment
Хотя a ‹b, результатом a% b будет a, должно быть первым ответом на этот вопрос, спасибо! - person Vladislav Sorokin; 03.09.2020

Другой способ думать об этом как о представлении вашего числа, кратного другому числу. То есть a = n*b + r, где b>r>=0. В этом смысле ваш случай дает 1 = 0*4 + 1. (править: говорить только о положительных числах)

person sashkello    schedule 01.05.2013

Я думаю, вы запутались между операторами %(Remainder) и /(Division).

Когда вы говорите %, вам нужно продолжать делить дивиденд до тех пор, пока вы не получите остаток 0 или возможный конец. И то, что вы получаете в итоге, называется Remainder.

Когда вы говорите /, вы делите дивиденд до тех пор, пока делитель не станет равным 1. И конечный продукт, который вы получите, называется Quotient.

person Ravi Trivedi    schedule 01.05.2013

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

17 % 5 = ?
17 - 5 = 12
12 % 5 = ?
12 - 5 = 7
7 % 5 = ?
7 - 5 = 2
2 % 5  = 2

Следовательно, 17% 5, 12% 5, 7% 5 все дают ответ 2. Это потому, что 2/5 = 0 (при работе с целыми числами) с 2 в качестве остатка.

person XcodeNOOB    schedule 09.02.2016