我是Erlang的新手。如何执行模运算(获取除法余数)?在大多数类C语言中,它是%,但在Erlang中这表示注释。
许多人都用rem来回答,这在大多数情况下是可以的。但是我正在重新考虑这个问题,因为现在我需要使用负数并且rem给出的是除法余数,而不是负数情况下的模运算结果。
我是Erlang的新手。如何执行模运算(获取除法余数)?在大多数类C语言中,它是%,但在Erlang中这表示注释。
许多人都用rem来回答,这在大多数情况下是可以的。但是我正在重新考虑这个问题,因为现在我需要使用负数并且rem给出的是除法余数,而不是负数情况下的模运算结果。
5 rem 3.
的结果是2
,-5 rem 3.
的结果是-2
。如果我理解你的问题,你希望-5 rem 3.
的结果是1,因为-5 = -2 * 3 + 1.
。这样做是否符合你的要求?mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.
erlang取模运算符是rem
Eshell V5.6.4 (abort with ^G)
1> 97 rem 10.
7
我在 Elixir 中使用了以下代码:
defp mod(x,y) when x > 0, do: rem(x, y);
defp mod(x,y) when x < 0, do: rem(x, y) + y;
defp mod(0,_y), do: 0
% Returns the positive remainder of the division of X by Y, in [0;Y[.
% In Erlang, -5 rem 3 is -2, whereas this function will return 1,
% since -5 =-2 * 3 + 1.
modulo(X,Y) when X > 0 ->
X rem Y;
modulo(X,Y) when X < 0 ->
K = (-X div Y)+1,
PositiveX = X + K*Y,
PositiveX rem Y;
modulo(0,_Y) ->
0.
被接受的答案是错误的。
rem
的行为与现代 C 中的 %
运算符完全相同。它使用截断除法。
被接受的答案在 X<0 和 Y<0 时会失败。考虑 mod(-5,-3)
:
C: -5 % -3 == -2
rem: -5 rem -3 == -2
Y + X rem Y: -3 + -5 rem -3 == -5 !! wrong !!
取模运算的替代实现使用向下取整除法和欧几里得除法。它们的结果如下:
flooring division: -5 mod -3 == -2
euclidean division: -5 mod -3 == 1
Y + X rem Y
当X < 0且Y < 0时,不会产生任何模运算符。
而rem
按预期工作 - 它使用截断除法。
Erlang的余数函数不能处理负数,因此您需要为负参数编写自己的函数。
mod(A, B) when A > 0 -> A rem B;
mod(A, B) when A < 0 -> mod(A+B, B);
mod(0, _) -> 0.
% console:
3> my:mod(-13, 5).
2