我正在尝试修改一个整数以获取数组位置,以便它将循环。对正数执行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的取值。

07-24 13:57