私は、配列の位置を取得するために整数を修正し、それがループするようにしようとしています。i % を実行します。 arrayLength` は正の数ではうまくいくのですが、負の数ではすべてうまくいきません。
4 % 3 == 1
3 % 3 == 0
2 % 3 == 2
1 % 3 == 1
0 % 3 == 0
-1 % 3 == -1
-2 % 3 == -2
-3 % 3 == 0
-4 % 3 == -1
の実装が必要です。
int GetArrayIndex(int i, int arrayLength)
のような
GetArrayIndex( 4, 3) == 1
GetArrayIndex( 3, 3) == 0
GetArrayIndex( 2, 3) == 2
GetArrayIndex( 1, 3) == 1
GetArrayIndex( 0, 3) == 0
GetArrayIndex(-1, 3) == 2
GetArrayIndex(-2, 3) == 1
GetArrayIndex(-3, 3) == 0
GetArrayIndex(-4, 3) == 2
以前にもやったことがあるのですが、なぜか今日は脳が溶けています :(
私はいつも、次のように定義された私自身の mod
関数を使用しています。
int mod(int x, int m) {
return (x%m + m)%m;
}
もちろん、モジュラス演算の呼び出しが2回あることが気になるのであれば、次のように書くこともできます。
int mod(int x, int m) {
int r = x%m;
return r<0 ? r+m : r;
}
またはその変種である。
これがうまくいく理由は、"x%m"は常に[-m+1, m-1]の範囲にあるからです。したがって、もしそれが負であれば、mを足すと、その値をm倍したまま正の範囲に入ります。
C#やC++の%演算子はモジュロではなく、余りであることに注意してください。あなたの場合、モジュロの式は次のようになります。
float nfmod(float a,float b)
{
return a - b * floor(a / b);
}
C#(またはC++)でこれを再コード化する必要がありますが、これは剰余ではなくモジュロを得るための方法です。