Помогите разобраться с работой по модулю в круговом массиве - PullRequest
3 голосов
/ 11 мая 2011

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

Учитывая q: массив символов длиной 5 элементов, константа MAX дает максимальную длину массива "5", редко встречается int, представляющий первый доступныйпятно в массиве q

    public void enqueue(Character c)throws FullQueueException{

    if(size()== MAX -1){ //if only 1 place left, is full, throw exc 

        throw new FullQueueException("Queue is full");
    }
    q[rare]=c;  
    rare=(rare+1)%MAX;
}

Теперь, предположив, что редкое «первое пустое пятно» равно трем, какое будет редкое значение после завершения метода?это то, что я не получаю, редкий = (редкий + 1)% Макс означает редкий = 4% 5, что дает редкий = 0,8.

То же самое для размера метода:

public int size() {

    return (MAX - front + rear) % MAX;
}

Учитывая, front, переменная int, которая представляет первый элемент в массиве. Предположим, что front равен 1, а редкий 4, поэтому в массиве 3 элемента, поэтому размер равен (5-1 + 4)% 5, что составляет 8% 5, чтодает 1,6, в то время как фактический размер 3 Любое предложение?это может быть больше математики, чем Java, но, возможно, некоторые из вас сталкивались с такими же сомнениями раньше.Спасибо!

Ответы [ 2 ]

4 голосов
/ 11 мая 2011

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

4% 5 = 4 (потому что 4/5 равно 0, с остатком 4)

AND

8% 5 = 3 (потому что8/5 - это 1 с остатком 3)

Не видя остальную часть вашей реализации, немного сложно объяснить, почему используется модуль, но похоже, что он в основном используется для обеспечения того, чтобы вашкруговой массив обвивает.т.е. когда вы достигнете конца массива (скажем, индекс 7, массива с размером MAX 8, следующее значение, которое вы захотите, будет первым элементом, который будет 8% 8 или 0).

0 голосов
/ 11 мая 2011

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

a % b is the same as (a - a / b * b) 

Что касается циклов, то же самое, что и. (Предполагая, что b положительно)

int result = a;
while(a >= b) a -= b;
while(a + b <= 0) a += b;

Однако для rare = (rare + 1) % MAX это то же самое, что и

rare = (rare == MAX - 1 ? 0 : rare + 1);
...