範囲R = [ x , y ]によって制限された任意の整数入力Wについて、 Rに対するWの "オーバーフロー" (適切な項がないため)は です。これにより、 Wがyを超えると折り返しが発生します。W % (y-x+1) + x
この原則の例として、カレンダーの月を反復するとします。
int this_month = 5;
int next_month = (this_month + 1) % 12;
ここで、両方の整数は 0 から 11 の間になります。したがって、上記の式は整数を範囲R = [0,11] に「クランプ」します。式を使用するこのアプローチは、シンプルで洗練されており、分岐を省略できるため有利です。
では、逆に同じことをしたい場合はどうすればよいでしょうか? 次の式が機能します。
int last_month = ((this_month - 1) % 12 + 12) % 12;
しかし難解です。どうしたら美化できる?
tl;dr - 式((x-1) % k + k) % k
をさらに簡略化できますか?
注: C++ タグが指定されているのは、他の言語では剰余演算子の負のオペランドの処理が異なるためです。