制作一个类似于模数的函数,它也适用于负数
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
我需要创建一个函数 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