你在Erlang如何做模或余数?
我是Erlang的全新品牌。 你如何做模(获得一个部门的其余部分)? 在大多数C语言中它是%,但是在Erlang中指定了一个注释。
有几个人用雷姆回答,在大多数情况下是好的。 但是我正在重新审视这个问题,因为现在我需要使用负数,而rem会给你一个分数的余数,这与负数的模数不一样。
在Erlang中,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
根据这篇博客 ,这是rem
。
我使用了以下药剂:
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
请不要低估这个,因为这是另一种语言而不是问题。 我们都生活在这个梦想中,因为我们都有梁。
上面的Y + X rem Y似乎是错误的:(Y + X)rem Y或Y +(X rem Y)产生不正确的结果。 例如:让Y = 3。 如果X = -4,则第一个forms返回-1,如果X = -3,则第二个forms返回3,其中没有一个是[0; 3 [。
我用这个来代替:
% 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.
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
被接受的答案是错误的。
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
按预期工作 – 它使用截断分割。