Jak to zrobić modulo lub pozostała w Erlang?

głosy
39

Jestem nowy na Erlang. Jak to zrobić modulo (get resztę z dzielenia)? Jest% w większości języków takich jak C, ale to oznacza komentarz w Erlang.

Kilka osób odpowiedziała rzeczowego, który w większości przypadków jest w porządku. Ale ja revisiting to dlatego teraz muszę używać liczb ujemnych i rem daje resztę z dzielenia, która nie jest taka sama jak modulo dla liczb ujemnych.

Utwórz 09/12/2008 o 16:52
źródło użytkownik
W innych językach...                            


8 odpowiedzi

głosy
35

Erlang, 5 rem 3 daje 2 i 3. Daje -5 REM -2. Jeśli dobrze rozumiem pytanie, co chcesz -5 rem 3. otrzymując 1 zamiast od -5 = -2 * 3 + 1.

Czy to, co chcesz zrobić?

mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.
Odpowiedział 13/05/2009 o 16:30
źródło użytkownik

głosy
26

Operator Erlang modulo jest rem

Eshell V5.6.4  (abort with ^G)
1> 97 rem 10.
7
Odpowiedział 09/12/2008 o 16:57
źródło użytkownik

głosy
7

Użyłem następujących w eliksiru:

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

Proszę nie downvote to dlatego, że jest inny język niż pytanie. Wszyscy żyjemy sen, bo wszyscy mamy belkę.

Odpowiedział 06/12/2016 o 22:31
źródło użytkownik

głosy
3

Zgodnie z tym blogu , to rem.

Odpowiedział 09/12/2008 o 16:56
źródło użytkownik

głosy
2

Powyższy Y + Y X REM wydaje się problem: albo (Y + x) REM Y + lub Y (X REM Y) dostarcza błędne wyniki. Przykład: Niech Y = 3. Jeżeli X = -4, pierwsza postać zwraca -1, gdy X = -3 druga forma powraca 3, z których żadne nie jest w [0, 3 [.

Używam tego zamiast:

% 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.
Odpowiedział 05/03/2010 o 12:40
źródło użytkownik

głosy
1

Zaakceptowanych odpowiedź jest błędna.

remzachowuje się jak %operatora nowoczesnych C ścięty Wykorzystuje podział.

Przyjęte rozwiązanie nie dla X i Y <0 <0. Zastanów się mod(-5,-3):

C:                     -5 % -3 == -2
rem:                 -5 rem -3 == -2
Y + X rem Y:    -3 + -5 rem -3 == -5 !! wrong !!

Alternatywne realizacje dotyczące stosowania operatora modulo podłogi i Pion euklidesowej. Wyniki dla tych, są

flooring division:   -5 mod -3 == -2
euclidean division:  -5 mod -3 == 1

Więc

Y + X rem Y

nie odtworzenia każdego operatora modulo dla X i Y <0 <0.

I remdziała zgodnie z oczekiwaniami - to używając ściętego podział.

Odpowiedział 01/06/2015 o 16:58
źródło użytkownik

głosy
1
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
Odpowiedział 20/05/2012 o 21:19
źródło użytkownik

głosy
1

Erlang reszta nie działa z liczb ujemnych, więc trzeba napisać własną funkcję parametrów ujemnych.

Odpowiedział 13/05/2009 o 16:07
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more