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

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

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

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

Ответ 1

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

h = s / 3600;
m = (s / 60) % 60;
s = s % 60;

Ответ 2

0 % 3 = 0;
1 % 3 = 1;
2 % 3 = 2;
3 % 3 = 0;

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

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

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

  • Чтобы получить последние M цифр числа → N% (10 ^ M).

Ответ 3

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

Ответ 4

Я использовал его при ограничении числа на несколько кратных:

temp = x - (x % 10); //Restrict x to being a multiple of 10

Ответ 5

  • Значения упаковки (например, часы).
  • Обеспечение конечных полей симметричными ключевыми алгоритмами.
  • Побитовые операции.

И так далее.

Ответ 6

Пример. У вас есть сообщение из X байтов, но в вашем протоколе максимальный размер - Y и Y < X. Попробуйте написать небольшое приложение, которое разбивает сообщение на пакеты, и вы столкнетесь с модом:)

Ответ 7

Преобразование линейной структуры данных в структуру матрицы: где 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 все цифры с третьего по праву делятся на 100, так что остаток - это две самые правые цифры, в этом случае месяц равен 10. Чтобы извлечь год 195810 / 100 дает 1958 г.

Ответ 8

Вычисление простых чисел

Ответ 9

В любое время, когда у вас есть разделение и вы хотите выразить остаток, отличный от десятичного, подходит оператор mod. Вещи, которые приходят на ум, обычно, когда вы хотите сделать что-то человекочитаемое с остатком. Перечислите, сколько предметов вы можете положить в ведра и сказать "5 осталось". Хорошо.

Кроме того, если вы когда-либо находились в ситуации, когда вы можете набирать ошибки округления, модульное деление - это хорошо. Например, если вы делитесь на 3 довольно часто, вы не хотите проходить мимо .33333 в качестве остатка. Передача остатка и делителя (т.е. Фракции) является подходящей.

Ответ 10

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

Ответ 11

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

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

minutes_left = минуты% 60

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

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

Ответ 12

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

Если вам нужно ограничить число, находящееся в определенном диапазоне, вы можете использовать mod. Например, чтобы создать случайное число от 0 до 99, вы можете сказать:

num = MyRandFunction() % 100;

Ответ 13

Модуль также очень полезен, если по какой-то сумасшедшей причине вам нужно сделать целочисленное деление и получить десятичное число, и вы не можете преобразовать целое число в число, которое поддерживает десятичное деление, или если вам нужно вернуть часть вместо десятичной дроби.

Я буду использовать % в качестве оператора модуля

Например

2/4 = 0

где это делается

2/4 = 0 and 2 % 4 = 2

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

whole Number = numerator/divisor
fractionNumerator = numerator % divisor
fractionDenominator = divisor

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

Представьте себе функцию, в которой вы перебираете массив.

Function increase Or Decrease(variable As Integer) As Void
    n = (n + variable) % (listString.maxIndex + 1)  
    Print listString[n]
End Function

Причина, по которой это n = (n + variable)% (listString.maxIndex + 1), должна учитывать учетную запись max.

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

Ответ 14

  • Вычисление наибольшего общего делителя
  • Определение, является ли число палиндром
  • Определение того, содержит ли число только...
  • Определение количества... число состоит из...

Ответ 15

Один случай использования, который я видел недавно, - это когда вам нужно изменить число. Таким образом, 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 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;
}

Ответ 16

Мое любимое использование - для итерации.

Скажите, что у вас есть счетчик, который вы увеличиваете и хотите затем захватить из известного списка соответствующие элементы, но у вас есть только теги n, и вы хотите повторить цикл.

var indexFromB = (counter-1)%n+1;

Результаты (counter=indexFromB) заданы n=3:

`1=1`
`2=2`
`3=3`
`4=1`
`5=2`
`6=3`
...

Ответ 17

Это простой способ узнать, четное или нечетное число. Просто # mod 2, если он равен 0, он нечетный.