负数取余怎么弄啊?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

我正试图对一个整数进行建模,以得到一个数组位置,这样它就会循环。做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

提问于
用户回答回答于

请注意,C#和C ++的%运算符实际上不是一个模,它是余数。在你的情况下,你想要的模的公式是:

float nfmod(float a,float b)
{
    return a - b * floor(a / b);
}

你必须在C#(或C++)中重新编码

用户回答回答于

我总是使用我自己的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;
}

或其变体。

扫码关注云+社区