Πώς μπορώ να modulo ή υπόλοιπο σε Erlang;

ψήφοι
39

Είμαι καινούργια στην Erlang. Πώς μπορείτε να κάνετε modulo (να πάρει το υπόλοιπο μιας διαίρεσης); Είναι% στις περισσότερες C-όπως τις γλώσσες, αλλά ότι ορίζει ένα σχόλιο σε Erlang.

Αρκετοί άνθρωποι απάντησε με rem, η οποία στις περισσότερες περιπτώσεις είναι μια χαρά. Αλλά είμαι επανεξέταση αυτή, γιατί τώρα θα πρέπει να χρησιμοποιήσετε αρνητικούς αριθμούς και εμπράγματα σας δίνει το υπόλοιπο μιας διαίρεσης, το οποίο δεν είναι το ίδιο με το modulo για τους αρνητικούς αριθμούς.

Δημοσιεύθηκε 09/12/2008 στις 16:52
πηγή χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
35

Στην 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.
Απαντήθηκε 13/05/2009 στις 16:30
πηγή χρήστη

ψήφοι
26

Ο χειριστής Erlang modulo είναι rem

Eshell V5.6.4  (abort with ^G)
1> 97 rem 10.
7
Απαντήθηκε 09/12/2008 στις 16:57
πηγή χρήστη

ψήφοι
7

Χρησιμοποίησα τα εξής ελιξίριο:

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

Παρακαλώ μην downvote αυτό γιατί είναι μια άλλη γλώσσα από το θέμα. Όλοι μας ζούμε το όνειρο, γιατί όλοι έχουμε την ακτίνα.

Απαντήθηκε 06/12/2016 στις 22:31
πηγή χρήστη

ψήφοι
3

Σύμφωνα με αυτό το blog , είναι rem.

Απαντήθηκε 09/12/2008 στις 16:56
πηγή χρήστη

ψήφοι
2

Η ανωτέρω Y + X rem Y φαίνεται να είναι λάθος: είτε (Y + X) rem Υ ή Υ + (X rem Y) δώσει λανθασμένα αποτελέσματα. Ex: ας Y = 3. Εάν το Χ = -4, η πρώτη μορφή επιστρέφει -1, εάν το Χ = -3 η δεύτερη μορφή επιστρέφει 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.
Απαντήθηκε 05/03/2010 στις 12:40
πηγή χρήστη

ψήφοι
1

Η αποδεκτή απάντηση είναι λάθος.

remσυμπεριφέρεται ακριβώς όπως το %φορέα στον σύγχρονο C. Χρησιμοποιεί περικοπεί τμήμα.

Η αποδεκτή απάντηση αποτυγχάνει για το Χ <0 και Υ <0. Σκεφτείτε mod(-5,-3):

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

Οι εναλλακτικές εφαρμογές για τη χρήση χειριστή modulo πάτωμα διαίρεση και κατανομή Ευκλείδεια. Τα αποτελέσματα αυτά είναι

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

Έτσι

Y + X rem Y

δεν αναπαράγει κάθε φορέα modulo για το Χ <0 και Υ <0.

Και remλειτουργεί όπως ήταν αναμενόμενο - αυτό είναι με τη χρήση περικοπεί τμήμα.

Απαντήθηκε 01/06/2015 στις 16:58
πηγή χρήστη

ψήφοι
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
Απαντήθηκε 20/05/2012 στις 21:19
πηγή χρήστη

ψήφοι
1

Erlang υπόλοιπο δεν λειτουργεί με αρνητικούς αριθμούς, έτσι πρέπει να γράψετε τη δική σας λειτουργία για τις αρνητικές παραμέτρους.

Απαντήθηκε 13/05/2009 στις 16:07
πηγή χρήστη

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