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が最後のチーム番号よりも大きい場合、代わりに最初のチームの 1 つにラップバックします。最後のチームを通過します。

処理方法awayは、少し特殊です。% 演算子は、負の数の場合、希望どおりに折り返されません。たとえば、の代わりに-1 % 5あなたを与えます。この問題を回避する秘訣は、除数を追加することです。 あなたに4を与えます。-14(-1+5)%5

わかりやすくするために、コードを少し修正してみましょう。まず、別の変数nを使用してチームの数を表します (ここでも、コードで team_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それを折り返すようにし、+ nforawayは負の数で適切に折り返すようにします

于 2012-09-19T16:29:18.987 に答える