Распознавание, когда использовать оператор модуля - PullRequest
55 голосов
/ 09 апреля 2010

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

Я знаю, что могу использовать оператор модуля, чтобы увидеть, является ли число четным или нечетным, простым или составным, но это все. Я не часто думаю с точки зрения остатков. Я уверен, что оператор модуля полезен, и я хотел бы научиться использовать его в своих интересах.

У меня просто проблемы с определением, где применяется оператор модуля. В различных ситуациях программирования мне трудно увидеть проблему и понять: «Эй! Остальная часть деления будет работать здесь!».

Ответы [ 18 ]

25 голосов
/ 09 апреля 2010

Представьте, что у вас есть истекшее время в секундах, и вы хотите преобразовать его в часы, минуты и секунды:

h = s / 3600;
m = (s / 60) % 60;
s = s % 60;
20 голосов
/ 09 апреля 2010
0 % 3 = 0;
1 % 3 = 1;
2 % 3 = 2;
3 % 3 = 0;

Вы видели, что он сделал? На последнем этапе он вернулся к нулю. Это может быть использовано в таких ситуациях, как:

  1. Чтобы проверить, делится ли N на M (например, нечетное или четное) или же N кратно М.

  2. Чтобы поставить колпачок определенного значения. В данном случае 3.

  3. Чтобы получить последние M цифр числа -> N% (10 ^ M).
16 голосов
/ 09 апреля 2010

Я использую его для индикаторов выполнения и тому подобного, которые отмечают прохождение через большой цикл. Прогресс сообщается только каждый раз через цикл или при подсчете% n == 0.

11 голосов
/ 09 апреля 2010

Я использовал его, ограничивая число определенным кратным:

temp = x - (x % 10); //Restrict x to being a multiple of 10
10 голосов
/ 09 апреля 2010
  • Завершение значений (как часы).
  • Предоставление конечных полей для алгоритмов симметричного ключа.
  • Битовые операции.

и т. Д.

4 голосов
/ 09 апреля 2010

Пример. У вас есть сообщение из X байтов, но в вашем протоколе максимальный размер равен Y и Y

4 голосов
/ 26 мая 2016

Преобразование линейной структуры данных в матричную структуру: где a - индекс линейных данных, а b - количество элементов в строке:

row = a/b
column = a mod b

Примечание выше - упрощенная логика: a должно быть смещено -1 перед делением, а результат должен быть нормализован + 1.

Пример: (3 строки по 4)

1  2  3  4    
5  6  7  8    
9 10 11 12 

(7 - 1)/4 + 1 = 2

7 is in row 2

(7 - 1) mod 4 + 1 = 3 

7 is in column 3

Другое распространенное использование модуля: хеширование числа по месту. Предположим, что вы хотите сохранить год и месяц в шестизначном числе 195810. month = 195810 mod 100 все 3-е число справа делятся на 100, поэтому остаток - это 2 самые правые цифры, в этом случае месяц - 10. Чтобы извлечь год 195810 / 100 урожайность 1958 г.

3 голосов
/ 14 февраля 2017

Один случай использования, который я видел недавно, был, когда вам нужно поменять число. Например, 123456 становится 654321.

int number   = 123456;
int reversed = 0;

while ( number > 0 ) {
    # The modulus here retrieves the last digit in the specified number
    # In the first iteration of this loop it's going to be 6, then 5, ...
    # We are multiplying reversed by 10 first, to move the number one decimal place to the left.
    # For example, if we are at the second iteration of this loop, 
    #  reversed gonna be 6, so 6 * 10 + 12345 % 10 => 60 + 5
    reversed = reversed * 10 + number % 10;
    number = number / 10;
}
3 голосов
/ 09 апреля 2010

Как говорит @jweyrich, упаковка значений. Я нашел мод очень удобным, когда у меня есть конечный список, и я хочу перебрать его в цикле - как фиксированный список цветов для некоторых элементов пользовательского интерфейса, таких как серии диаграмм, где я хочу, чтобы все серии были разными насколько это возможно, но когда у меня закончились цвета, просто начать все сначала. Это может также использоваться, скажем, с шаблонами, так что, когда красный цвет появляется во второй раз, он разбивается; в третий раз, пунктир и т. д. - но мод просто используется, чтобы получить красный, зеленый, синий, красный, зеленый, синий, навсегда.

3 голосов
/ 03 августа 2014

Модуль может быть полезен для преобразования и деления общих минут на «часы и минуты»:

часы = минуты / 60

minutes_left = минуты% 60

В битах часов нам нужно убрать десятичную часть, и это будет зависеть от языка, который вы используете.

Затем мы можем соответствующим образом изменить выход.

...