这适合我,但我不明白它是如何工作的。谁能解释一下?
for(int round = 0; round < rounds_count; round++)
{
for(int match = 0; match < matches_per_round; match++)
{
int home = (round + match) % (teams_count - 1);
int away = (teams_count - 1 - match + round) % (teams_count - 1);
if(match == 0)
away = teams_count - 1;
matches.push_back(Match(&teams[home], &teams[away], round));
}
}
模数的诀窍是什么?
答案 0 :(得分:4)
我不确定为什么会使用teams_count-1
代替teams_count
,但一般来说,模数会使其“环绕”,以便round+match
大于away
最后一个球队的号码,它将回到第一支球队之一,而不是经过最后一支球队。
处理-1 % 5
的方式有点特别。当您有负数时,%运算符不会以您想要的方式回绕。例如-1
为您提供4
而不是(-1+5)%5
。解决这个问题的一个技巧是添加你的除数。 n
给你4。
让我们重新编写代码以使其更清晰。首先,我将使用另一个变量int n = teams_count-1;
int home = (round + match) % n;
int away = (n - match + round) % n;
来表示团队数量(再次,我不确定为什么在您的代码中使用teams_count-1):
away
然后我会稍微重新组织int n = teams_count-1;
int home = (round + match) % n;
int away = (round - match + n) % n;
计算:
% n
现在应该更清楚的是主队从当前一轮开始然后添加比赛,而客场球队从当前一轮开始并减去比赛。 + n
使其环绕,away
{{1}}使其正确地包围负数