我有一个小问题试图弄清楚如何计算模运算。 我正在建立一个队列,所以我有一个圆形阵列。 我无法弄清楚这个模运算是如何工作的。
给定q:一个长度为5个元素的Character数组, MAX常量给出数组“5”的最大长度 rare是一个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)%MAX表示罕见= 4%5,这给出罕见= 0,8。
方法大小相同:
public int size() {
return (MAX - front + rear) % MAX;
}
给出前面一个int变量,它表示数组中的第一个元素 假设前面是1并且稀有4,所以阵列中有3个元素,因此大小为(5-1 + 4)%5,即8%5,给出1.6,而实际大小为3 有什么建议吗?这可能是比java更多的数学,但可能你们中的一些人之前遇到过同样的疑问。 谢谢!
答案 0 :(得分:4)
我认为你对模运算的作用有点混淆。它给出了除法后的整数余数。所以从你的例子。
4%5 = 4(因为4/5为0,余数为4)
和
8%5 = 3(因为8/5是1,余数为3)
没有看到你的其余实现,有点难以进一步解释为什么使用modulo,但看起来它基本上用于确保你的圆形数组包裹。即,当你点击数组的末尾(比如索引7,MAX大小为8的数组,你想要的下一个值就是第一个元素,即8%8或0)。
答案 1 :(得分:0)
整数运算只会产生整数。虽然模数与除法有关,但它不是除法。
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);