制作一个类似于模数的函数,它也适用于负数

Make a function similar to modulo that also works with negative numbers

我需要创建一个函数 f(a,b),它会给出以下结果:

f(0, 3) = 0
f(1, 3) = 1
f(2, 3) = 2
f(3, 3) = 0
f(4, 3) = 1... (this works exactly like a%b)

但是负数也应该遵循这种模式:

f(-4, 3) = 2
f(-3, 3) = 0
f(-2, 3) = 1
f(-1, 3) = 2
f( 0, 3) = 0

我目前找到了这个解决方案:

x = a % b
return a < 0 && mod != 0 ? mod + b : mod;

然而,对于我想要实现的目标来说,这感觉太复杂和太慢了。难道没有更简单的方法来生成类似于对负值继续取模的序列吗?

模运算行为取决于编程语言 - 请参阅 table here

例如,在 Python print(-4 % 3) 中给出 2

您似乎在使用 C-like 语言,其中余数与被除数的符号相同。在这种情况下,您可以使用这样的公式 (ideone)

(a % b + b) % b 

此外,唯一的比较就足以纠正负值(因此避免双重 %

rem = a % b;
if (rem < 0) rem += b;

这不是任何 b 的通用解决方案,但如果您只需要从两侧环绕一个数组并且您将索引递减 1(或最多递减 a ) 任何 b >= -a 的有效甚至更短的解决方案是:

(a + b) % b