我正在尝试修改一个整数以获取数组位置,以便它将循环。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) == 1GetArrayIndex( 3, 3) == 0GetArrayIndex( 2, 3) == 2GetArrayIndex( 1, 3) == 1GetArrayIndex( 0, 3) == 0GetArrayIndex(-1, 3) == 2GetArrayIndex(-2, 3) == 1GetArrayIndex(-3, 3) == 0GetArrayIndex(-4, 3) == 2我以前做过,但是由于某种原因,今天它融化了我的大脑:(
4 回答
繁星coding
TA贡献1797条经验 获得超4个赞
我总是使用自己的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值。
慕哥9229398
TA贡献1877条经验 获得超6个赞
请注意,C#和C ++的%运算符实际上不是模数,而是余数。在您的情况下,所需的取模公式为:
float nfmod(float a,float b)
{
return a - b * floor(a / b);
}
您必须使用C#(或C ++)重新编码,但这是获得模数而不是余数的方式。
心有法竹
TA贡献1866条经验 获得超5个赞
增加一些理解。
根据欧几里得的定义,模结果必须始终为正。
例如:
int n = 5;
int x = -3;
int mod(int n, int x)
{
return ((n%x)+x)%x;
}
输出:
-1
- 4 回答
- 0 关注
- 764 浏览
添加回答
举报
0/150
提交
取消