Каково практическое использование модуля (%) в программировании?

Возможный дубликат:
Признание, когда следует использовать оператор mod

Каково практическое применение модуля? Я знаю, что такое модульное подразделение. Первый сценарий, который приходит мне на ум, - использовать его для поиска нечетных и четных чисел и арифметики часов. Но где еще я мог бы использовать его?

Ответ 1

Наиболее распространенное использование, которое я нашел, это "обертывание" ваших индексов массива.

Например, если вы просто хотите циклически перебирать массив, вы можете использовать:

int a[10];
for (int i = 0; true; i = (i + 1) % 10)
{
  // ... use a[i] ...
}

По модулю гарантирует, что i остается в диапазоне [0, 10].

Ответ 2

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

string number_to_string(uint number) {
  string result = "";
  while (number != 0) {
    result = cast(char)((number % 10) + '0') ~ result;
    //                   ^^^^^^^^^^^
    number /= 10;
  }
  return result;
}

Ответ 3

Одно использование для работы модуля заключается в создании хэш-таблицы . Он использовался для преобразования значения из хеш-функции в индекс в массив. (Если размер таблицы хэшей равен мощности два, модуль может быть выполнен с помощью битовой маски, но он все еще является модулем.)

Ответ 4

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

Пример:

int i;
for (i = 1; i <= 1000000; i++)
{
   do_something(i);
   if (i % 1000 == 0)
       printf("%d processed\n", i);
}

Ответ 5

  • Криптография. Это само по себе будет объяснять непристойный процент модуля (я преувеличиваю, но вы понимаете).

Попробуйте страницу Википедии:

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

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

Ответ 6

Обычная реализация буферизованной связи использует циклические буферы, и вы управляете ими с помощью арифметики модуля.

Ответ 7

Для контрольного номера международных номеров банковских счетов метод mod97.

Также в больших партиях сделать что-то после n итераций. Вот пример для NHibernate:

ISession session = sessionFactory.openSession();
ITransaction tx = session.BeginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.Save(customer);
    if ( i % 20 == 0 ) { //20, same as the ADO batch size
        //Flush a batch of inserts and release memory:
        session.Flush();
        session.Clear();
    }
}

tx.Commit();
session.Close();

Ответ 8

Хорошо, есть много перспектив, на которые вы можете посмотреть. Если вы рассматриваете его как математическую операцию, то это просто модульное деление. Даже нам это не нужно, как независимо от того, что делает%, мы можем добиться использования вычитания, но каждый язык программирования реализует его очень оптимизированным образом.

И модульное деление не ограничивается поиском нечетных и четных чисел или арифметики часов. Существуют сотни алгоритмов, которым нужна эта операция модуля, например, криптографические алгоритмы и т.д. Таким образом, это общая математическая операция, такая как другие +, -, *,/и т.д.

За исключением математической перспективы, разные языки используют этот символ для определения встроенных структур данных, например, в Perl %hash используется, чтобы показать, что программист объявил хэш. Таким образом, все зависит от языка программирования.

Поэтому все еще есть много других перспектив, которые можно добавить в список использования%.

Ответ 9

Для языков, у которых нет побитовых операторов, модуль может использоваться для получения младших n бит числа. Например, чтобы получить младшие 8 бит x:

x % 256

что эквивалентно:

x & 255