Помогите разобраться в операции по модулю в циклическом массиве

#java #arrays #queue #modulo

#java #массивы #очередь #modulo

Вопрос:

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

Учитывая 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;
}
  

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

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

 public int size() {

    return (MAX - front   rear) % MAX;
}
  

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

Ответ №1:

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

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

И

8% 5 = 3 (потому что 8/5 равно 1 с остатком от 3)

Не видя остальной части вашей реализации, немного сложно объяснить, почему используется modulo, но похоже, что в основном это используется для обеспечения того, чтобы ваш циклический массив обтекался. т. Е. Когда вы нажимаете на конец массива (скажем, индекс 7 массива с МАКСИМАЛЬНЫМ размером 8, следующее значение, которое вы хотели бы получить, было бы первым элементом, который был бы равен 8%8 или 0).

Комментарии:

1. Ага. Извините за это. Опечатка с моей стороны. Должно быть исправлено сейчас.

Ответ №2:

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

 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);