模数码简化

时间:2014-07-28 01:06:47

标签: c++

我在“竞争规划2”一书中发现了一些我不太了解的内容。 我很新,试图搜索问题,但仍然没有希望,也许我是盲人。

index = (index+1)%n

的简化
index++;
if(index>=n){
    index=0;
}

为什么?虽然它没有成功。 来源:竞争性编程2,第12页,编程中用于c / c ++ / java的快捷方式。

3 个答案:

答案 0 :(得分:2)

概念很简单,想想一个3长的数组(即n = 3)。从0开始,继续前进:

start       calculation   next
0 : (0 + 1) % 3 : 1 % 3 : 1
1 : (1 + 1) % 3 : 2 % 3 : 2
2 : (2 + 1) % 3 : 3 % 3 : 0

它正在做的是反复循环遍历长度为n的数组的索引,您可以按以下方式使用它

while (!done)
    index = (index+1)%n;
    //do something
    if (itWorked)
        done = true;

这可以循环执行某些操作的数组,并始终提供下一个入站索引。

就第二部分而言,这两个代码段是等效的。

0 : ++0 < 3 : true : 1
1 : ++1 < 3 : true : 2
2 : ++2 < 3 : false : 0

所以你可以使用其中任何一个。当然第二个更具可读性。

当然,如果index > n不会出现这种情况,但事实并非如此。

答案 1 :(得分:0)

陈述错了。 仅当0 <= index&lt; n在执行

之前
index = (index+1)%n

例如,index = 5,n = 4

第一个程序的结果是

(5 + 1) % 4 = 2

第二个程序的结果是0

至于为什么两个程序是等价的,系统的方法是找到所有初始条件的情况。 假设0&lt; = index&lt; n,那么只有两种情况

案例1.索引+ 1 == n

案例2.索引+ 1&lt; Ñ

如果您将两个案例中的值放入两个程序中,您将看到它们的结果对于满足假设的所有可能输入都是等效的。这就是为什么他们声称一个是另一个的简化。

答案 2 :(得分:0)

在这种情况下(仅添加一个),模运算符版本将给出相同的结果。基本上,正在发生的是索引首先递增(因为括号)。然后使用模运算符检查索引的剩余部分和n。当index和n相同(相当于if(index>=n))时,结果将为0(相当于index=0)。

然而,这个例子可能会引起问题,因为如果你的增量超过1则不会起作用,因为索引%n,而n> index是&gt;零(不等于index=0)。它还假设索引开始小于n,这也是危险的。在使用这样的代码之前,请确保您了解这一点。

这段代码基本上是作者尝试做一些聪明的事情,但最终会产生不太可读的代码,这些代码只能在非常特定的启动条件下正常运行,这些条件可能会无声地失败。以此为例,说明不该做的事情。