Mod为负数正在融化我的大脑

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

我以前做过,但是由于某种原因,今天它融化了我的大脑:(


蛊毒传说
浏览 765回答 4
4回答

繁星coding

我总是使用自己的mod函数,定义为int mod(int x, int m) {&nbsp; &nbsp; return (x%m + m)%m;}当然,如果您不愿意两次调用模数运算,可以将其写为int mod(int x, int m) {&nbsp; &nbsp; int r = x%m;&nbsp; &nbsp; return r<0 ? r+m : r;}或其变体。它起作用的原因是“ x%m”始终在[-m + 1,m-1]范围内。因此,如果完全为负,则将其添加到m会将其置于正范围内,而不会更改其模m值。

慕哥9229398

请注意,C#和C ++的%运算符实际上不是模数,而是余数。在您的情况下,所需的取模公式为:float nfmod(float a,float b){&nbsp; &nbsp; return a - b * floor(a / b);}您必须使用C#(或C ++)重新编码,但这是获得模数而不是余数的方式。

心有法竹

增加一些理解。根据欧几里得的定义,模结果必须始终为正。例如:&nbsp;int n = 5;&nbsp;int x = -3;&nbsp;int mod(int n, int x)&nbsp;{&nbsp; &nbsp; &nbsp;return ((n%x)+x)%x;&nbsp;}输出:&nbsp;-1
打开App,查看更多内容
随时随地看视频慕课网APP