Nasıl Erlang modulo veya kalanı yapmalıyım?

oy
39

Ben Erlang için yepyeni değilim. Nasıl modulo (Bir bölmeden kalan olsun) yapacağız? Çoğu C benzeri dillerde%, ama bu Erlang bir yorum atar.

Birkaç kişi çoğu durumda gayet rem ile cevap verdi. şimdi negatif sayılar kullanmak gerekir ve rem size negatif sayılar için modulo aynı değildir bir bölümü, kalanını verir çünkü Ama bu yeniden ziyaret ediyorum.

Oluştur 09/12/2008 saat 16:52
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
3

Göre bu blog yayınına , bu kadar rem.

Cevap 09/12/2008 saat 16:56
kaynak kullanıcı

oy
26

erlang modülo operatörüdür rem

Eshell V5.6.4  (abort with ^G)
1> 97 rem 10.
7
Cevap 09/12/2008 saat 16:57
kaynak kullanıcı

oy
1

Erlang kalanı değil negatif sayılar ile çalışır, bu nedenle olumsuz parametreler için kendi fonksiyonunu yazmak zorunda.

Cevap 13/05/2009 saat 16:07
kaynak kullanıcı

oy
35

Erlang olarak, 5 rem 3. 2 elde edilir, ve -5 rem 3. verir -2. Sorunuzu anlamak, isteyeyim -5 rem 3. beri -5 = -2 * 3 + 1, yerine 1 elde edilir.

İstediğin bu yapar mı?

mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.
Cevap 13/05/2009 saat 16:30
kaynak kullanıcı

oy
2

Yukarıda Y + X rem Y, yanlış olduğu görünmektedir: (Y + X) rem Y veya Y + (X rem Y) ya da hatalı sonuçlar verir. Örn: Y = 3 olsun. 3 [X = -3 ikinci form [0 olan hiçbiri, 3 döndürür X = -4 ise, birinci şekilde, -1 döndürür.

Bunun yerine bunu kullanın:

% 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.
Cevap 05/03/2010 saat 12:40
kaynak kullanıcı

oy
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
Cevap 20/05/2012 saat 21:19
kaynak kullanıcı

oy
1

Kabul cevap yanlış.

remTam gibi davranır %Bu kesik bölümü kullanan, modern C operatör.

Kabul cevabı X <0 ve Y <0 için başarısız olur. düşünün mod(-5,-3):

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

modülo operatör kullanımı için alternatif uygulama bölümü ve Öklid bölümü katlıdır. olanlar için sonuçlar

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

Yani

Y + X rem Y

X <0 ve Y <0 için herhangi modülo operatörü yeniden etmez.

Ve remo kesik bölünmeyi kullanıyor - beklendiği gibi çalışır.

Cevap 01/06/2015 saat 16:58
kaynak kullanıcı

oy
7

Ben iksir aşağıdaki kullandı:

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

söz daha başka bir dil olduğu için bu downvote etmeyin. Hepimizin ışınını var çünkü Hepimiz rüya yaşıyor.

Cevap 06/12/2016 saat 22:31
kaynak kullanıcı

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