我试图对一个整数进行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
我以前也这样做过,但由于某种原因,今天它让我的大脑融化了:
发布于 2011-06-19 12:07:56
请注意,C#和C++的%运算符实际上不是模数,而是余数。在你的例子中,你需要的模数公式是:
float nfmod(float a,float b)
{
return a - b * floor(a / b);
}
你必须用C# (或C++)重新编码,但这是你得到模数而不是余数的方法。
发布于 2014-04-22 16:27:51
只使用一次%
的单行实现:
int mod(int k, int n) { return ((k %= n) < 0) ? k+n : k; }
发布于 2018-06-25 15:49:54
比较两个主要答案
(x%m + m)%m;
和
int r = x%m;
return r<0 ? r+m : r;
没有人真正提到第一个答案可能会抛出OverflowException
,而第二个答案不会。更糟糕的是,在默认未检查上下文的情况下,第一个答案可能会返回错误的答案(例如参见mod(int.MaxValue - 1, int.MaxValue)
)。因此,第二个答案不仅看起来更快,而且更正确。
https://stackoverflow.com/questions/1082917
复制相似问题