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