我正在尝试修改一个整数以获取数组位置,以便它将循环。对正数执行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;
}
当然,如果您不愿意两次调用模数运算,可以将其写为
int mod(int x, int m) {
int r = x%m;
return r<0 ? r+m : r;
}
或其变体。
它起作用的原因是“x%m”始终在[-m + 1,m-1]范围内。因此,如果它完全为负,则将其添加到m会使它处于正范围,而不会改变其对m的取值。