我在“竞争规划2”一书中发现了一些我不太了解的内容。 我很新,试图搜索问题,但仍然没有希望,也许我是盲人。
index = (index+1)%n
是
的简化index++;
if(index>=n){
index=0;
}
为什么?虽然它没有成功。 来源:竞争性编程2,第12页,编程中用于c / c ++ / java的快捷方式。
答案 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,这也是危险的。在使用这样的代码之前,请确保您了解这一点。
这段代码基本上是作者尝试做一些聪明的事情,但最终会产生不太可读的代码,这些代码只能在非常特定的启动条件下正常运行,这些条件可能会无声地失败。以此为例,说明不该做的事情。