0

这对我有用,但我根本不明白它是如何工作的。谁能解释一下?

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

模数的诀窍是什么?

4

1 回答 1

4

我不确定为什么要使用teams_count-1而不是teams_count,但总的来说,模数使其“环绕”,因此如果round+match大于最后一个团队编号,它将返回到第一个团队中的一个而不是越过最后一支球队。

处理的方式away,有点特别。当您有负数时, % 运算符不会以您想要的方式环绕。例如-1 % 5给你-1而不是4. 解决此问题的一个技巧是添加除数。 (-1+5)%5给你4。

让我们稍微修改一下代码以使其更清晰。首先,我将使用另一个变量n来表示团队的数量(同样我不确定为什么在您的代码中使用 teams_count-1):

int n = teams_count-1;
int home = (round + match) % n;
int away = (n - match + round) % n;

然后我将重新组织away计算:

int n = teams_count-1;
int home = (round + match) % n;
int away = (round - match + n) % n;

现在应该更清楚的是,主队从本轮开始,然后添加比赛,而客队从本轮开始,然后减去比赛。% n使其环绕,而for+ n使其away以负数正确环绕

于 2012-09-19T16:29:18.987 回答