2010-08-28 3 views
10

Можно создать дубликат:
Recognizing when to use the mod operatorКаково практическое использование модуля (%) в программировании?

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

+6

Слишком много приложений. Вероятно, это должна быть вики сообщества. – kennytm

+5

Вы используете его, когда это необходимо. «Арифметика часов» охватывает все виды использования, не так ли? –

ответ

5

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

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

+1 для использования D. :) –

19

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

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

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

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

+1

Я не мог придумать никакого полезного использования такого бесконечного цикла, но он выглядит круто. – 2ndkauboy

+0

@ Kau-Boy Возможно, массив изображений для циклического перехода на заголовке веб-сайта, но тогда менее тривиально указать 'if (i> count (array)) i = 1;', чтобы запустить его снова. Тем не менее, цикл for хорошо размещает требуемый код отображения внутри блока. – amcc

+0

Отличный ответ и использование. – fanbondi

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

Попробуйте the Wikipedia page тоже:

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

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

5

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

+0

Можете ли вы сделать пример кода? – eaglei22

2

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

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

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

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

3

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

2

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

x % 256 

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

x & 255 
+2

Это не достаточно общее, работает только для 2^n. – Gob00st

+2

Важно отметить, что эта формула работает только для неотрицательных значений x. Если x отрицательно, 'x & 255' будет правильно сообщать младшие биты, в то время как в большинстве компиляторов (включая все, что соответствует последним стандартам) x% 256 даст мусор. – supercat

4

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

Пример:

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

По некоторым реализациям это может быть очень дорого. –

3

для контроля количества международного банковского счета п umbers, mod97 technique.

Также в больших партиях сделать что-то после 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(); 
Смежные вопросы