Каковы практические применения модуля (%) в программировании? [duplicate]

11
задан 8 revs, 5 users 48% 23 May 2017 в 12:10
поделиться

7 ответов

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

5
ответ дан 3 December 2019 в 00:51
поделиться

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

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

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

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

3
ответ дан 3 December 2019 в 00:51
поделиться
  • Криптография. Уже одно это объясняет непристойный процент модуля (я преувеличиваю, но суть вы поняли).

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

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

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

3
ответ дан 3 December 2019 в 00:51
поделиться

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

Например, если вы просто хотите повторно просмотреть массив, вы можете использовать:

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

Модуль гарантирует, что i останется в диапазоне [0, 10).

23
ответ дан 3 December 2019 в 00:51
поделиться

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

string number_to_string(uint number) {
  string result = "";
  while (number != 0) {
    result = cast(char)((number % 10) + '0') ~ result;
    //                   ^^^^^^^^^^^
    number /= 10;
  }
  return result;
}
6
ответ дан 3 December 2019 в 00:51
поделиться

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

Пример:

int i;
for (i = 1; i <= 1000000; i++)
{
   do_something(i);
   if (i % 1000 == 0)
       printf("%d processed\n", i);
}
6
ответ дан 3 December 2019 в 00:51
поделиться

Для контрольного номера международных номеров банковских счетов используется метод 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();
4
ответ дан 3 December 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: