Grundlegendes zum Moduloperator%

70

Ich verstehe den Moduloperator anhand des folgenden Ausdrucks:

7 % 5

Dies würde 2 zurückgeben, da 5 einmal in 7 geht und dann die 2 ergibt, die übrig bleibt. Meine Verwirrung kommt jedoch, wenn Sie diese Aussage umkehren, um zu lesen:

5 % 7

Dies gibt mir den Wert 5, was mich leicht verwirrt. Obwohl die Gesamtheit von 7 nicht in 5 geht, gibt es einen Teil davon. Warum gibt es entweder keinen Rest oder einen Rest von positiven oder negativen 2?

Wenn der Wert von 5 auf der Grundlage der Tatsache berechnet wird, dass 7 überhaupt nicht in 5 übergeht, warum ist der Rest dann nicht 7 statt 5?

Ich habe das Gefühl, dass mir hier etwas fehlt, um den Moduloperator zu verstehen.

Peter Featherstone
quelle
6
Der Modul ist 'absoluter Wert'. Sie beziehen sich auf "Modulo", was mit Resten zu tun hat. Es ist schade, dass die Wörter so ähnlich sind, wie es viele Leute stolpert.
Discordanian
Ich hatte ein Problem mit Dezimalstellen und negativen Zahlen und fand meine Antwort hier: stackoverflow.com/questions/48662225/…
B. Dionys
Es ist der Restoperator . Nicht der 'Moduloperator'.
user207421
Es war verwirrend, dass ich 1 % 500zurückkam, 1aber wenn Sie die lange Division von Hand machen, würde ich ohne Rest vollständig in 500 gehen (aber es wäre ein Dezimalergebnis). Nachdem ich die Antworten gelesen habe, habe ich festgestellt, dass %dies nicht in Dezimalstellen geht, sodass für 1% 500 die gesamte Zahl als Rest zurückgegeben wird. Welches ist wahr, wenn Sie darüber nachdenken.
Klicken Sie auf Upvote
%ist ein multiplikativer Operator , der den Rest einer Division zurückgibt. Er entspricht nicht den Regeln für die Modulo- Operation. Siehe diese Antwort .
RobG

Antworten:

134

(Diese Erklärung gilt nur für positive Zahlen, da sie ansonsten von der Sprache abhängt.)

Definition

Der Modul ist der Rest der euklidischen Division einer Zahl durch eine andere. %wird die Modulo-Operation genannt .

Zum Beispiel 9durch 4gleich geteilt, 2aber es bleibt 1. Hier 9 / 4 = 2und 9 % 4 = 1.

Euklidische Division

In Ihrem Beispiel: 5 geteilt durch 7 ergibt 0, aber es bleibt 5 ( 5 % 7 == 5).

Berechnung

Die Modulo-Operation kann unter Verwendung dieser Gleichung berechnet werden:

a % b = a - floor(a / b) * b
  • floor(a / b)die Anzahl der Male stellt man teilen kann adurchb
  • floor(a / b) * b ist der Betrag, der erfolgreich vollständig geteilt wurde
  • Die Summe ( a) abzüglich der geteilten Beträge entspricht dem Rest der Division

Auf das letzte Beispiel angewendet ergibt dies:

5 % 7 = 5 - floor(5 / 7) * 7 = 5

Modulararithmetik

Das heißt, Ihre Intuition war, dass es -2 und nicht 5 sein könnte. Eigentlich in modularer Arithmetik, -2 = 5 (mod 7)weil es k in Z so existiert, dass 7k - 2 = 5.

Sie haben vielleicht keine modulare Arithmetik gelernt, aber Sie haben wahrscheinlich Winkel verwendet und wissen, dass -90 ° dasselbe ist wie 270 °, weil es Modulo 360 ist. Es ist ähnlich, es wird umbrochen! Nehmen Sie also einen Kreis und sagen Sie, dass der Umfang 7 ist. Dann lesen Sie, wo 5 ist. Und wenn Sie es mit 10 versuchen, sollte es bei 3 sein, weil 10 % 73 ist.

Maxime Chéramy
quelle
Danke, das war die Art von Antwort, nach der ich gesucht habe
Nader Belal
2
Tolle Erklärung - +1! Aber -1k für das Schneiden einer Pizza auf diese Weise;)
user3249027
Cool, führt aber %nicht die Modulo-Operation aus, sondern führt einen einfachen Rest aus und sollte daher als Restoperator bezeichnet werden .
RobG
@RobG das hängt eigentlich von der Sprache ab.
Maxime Chéramy
@RobG zum Beispiel in Lua ist% ein Mod und in C ist% ein Rem. Quelle: en.wikipedia.org/wiki/Modulo_operation#In_programming_languages
Maxime Chéramy
18

Lösung in zwei Schritten.

Einige der Antworten hier sind für mich kompliziert zu verstehen. Ich werde versuchen, eine weitere Antwort hinzuzufügen, um die Sichtweise zu vereinfachen.


Kurze Antwort:

Beispiel 1:

7 % 5 = 2

Jede Person sollte ein Stück Pizza bekommen.

Teilen Sie 7 Scheiben auf 5 Personen und jede der 5Personen erhält eine Pizzastück und wir erhalten am Ende 2Scheiben (verbleibende). 7 % 5gleich 2ist, weil 7 größer als ist 5 .


Beispiel 2:

5 % 7 = 5

Jede Person sollte ein Stück Pizza bekommen

Es gibt, 5weil 5 ist weniger als 7 . Per Definition können Sie also nicht ganze 5Elemente auf 7Personen aufteilen . Die Teilung findet also überhaupt nicht statt und Sie erhalten den gleichen Betrag, mit dem Sie begonnen haben 5.


Programmatische Antwort:

Der Prozess besteht im Wesentlichen darin, zwei Fragen zu stellen:

Beispiel A: (7% 5)

(Q.1) Welche Zahl muss mit 5 multipliziert werden, um 7 zu erhalten?

Two Conditions: Multiplier starts from `0`. Output result should not exceed `7`. 

Lass es uns versuchen:

Der Multiplikator ist also Null 0.0 x 5 = 0

Trotzdem sind wir kurz und addieren eins (+1) zum Multiplikator.

1 damit, 1 x 5 = 5

Wir haben noch keine 7 bekommen, also fügen wir eine hinzu (+1).

2 damit, 2 x 5 = 10

Jetzt haben wir übertroffen 7. Ist 2also nicht der richtige Multiplikator. Gehen wir einen Schritt zurück (wo wir verwendet haben 1) und denken Sie an das Ergebnis, das ist 5. Zahl 5ist hier der Schlüssel.

(Q.2) Wie viel müssen wir zu der 5(der Zahl, die wir gerade aus Schritt 1 erhalten haben) hinzufügen , um zu erhalten 7?

Wir ziehen die beiden Zahlen ab : 7-5 = 2.

Die Antwort für: 7 % 5ist 2;


Beispiel B: (5% 7)

1- Mit welcher Zahl multiplizieren wir 7, um 5 zu erhalten?

Two Conditions: Multiplier starts from `0`. Output result and should not exceed `5`. 

Lass es uns versuchen:

0 damit, 0 x 7 = 0

Wir haben noch keine 5 bekommen, versuchen wir es mit einer höheren Zahl.

1 damit, 1 x 7 = 7

Oh nein, wir haben übertroffen 5, kehren wir zum vorherigen Schritt zurück, in dem wir 0das Ergebnis verwendet haben 0.

2- Wie viel müssen wir hinzufügen 0(die Zahl, die wir gerade aus Schritt 1 erhalten haben), um den Wert der Zahl auf der linken Seite zu erreichen 5?

Es ist klar, dass die Zahl 5 ist. 5-0 = 5

   5 % 7 = 5

Hoffentlich hilft das.

Mohammed Joraid
quelle
10

Wie andere betont haben, basiert der Modul auf dem Restsystem.

Ich denke, eine einfachere Möglichkeit, über den Modul nachzudenken, besteht darin, was bleibt, nachdem eine Dividende (zu teilende Zahl) vollständig durch einen Divisor geteilt wurde. Wenn wir also an 5% 7 denken, wenn Sie 5 durch 7 teilen, kann 7 nur 0 Mal in 5 gehen und wenn Sie 0 (7 * 0) von 5 subtrahieren (genau wie wir es in der Grundschule gelernt haben), dann der Rest wäre 5 (der Mod). Siehe die Abbildung unten.

   0
  ______
7) 5    
__-0____
   5

Mit der gleichen Logik ist -5 mod 7 -5 (nur 0 7s können in -5 und -5-0 * 7 = -5 gehen). Mit dem gleichen Token wird -5 mod -7 auch -5 sein. Einige weitere interessante Fälle:

5 mod (-3) = 2 dh 5 - (-3 * -1)

(-5) mod (-3) = -2 dh -5 - (-3 * 1) = -5 + 3

Dean Sha
quelle
5

Es geht nur um die Reste. Lass mich dir zeigen wie

10 % 5=0
9 % 5=4 (because the remainder of 9 when divided by 5 is 4)
8 % 5=3
7 % 5=2
6 % 5=1

5 % 5=0 (because it is fully divisible by 5)

Jetzt sollten wir uns an eine Sache erinnern, Mod bedeutet Rest so

4 % 5=4

aber warum 4? weil 5 X 0 = 0 ist, ist 0 das nächste Vielfache, das kleiner als 4 ist, daher 4-0 = 4

Siddarth Nyati
quelle
2

Modul ist Restsystem.

Also 7% 5 = 2.

5% 7 = 5

3% 7 = 3

2% 7 = 2

1% 7 = 1

Bei Verwendung innerhalb einer Funktion zur Bestimmung des Array-Index. Ist es sicher zu programmieren? Das ist eine andere Frage. Ich vermute.

nammalvar 2.0
quelle
2

Schritt 1: 5/7 = 0,71

Schritt 2: Nehmen Sie die linke Seite der Dezimalstelle, also nehmen wir 0 von 0,71 und multiplizieren mit 7 0 * 7 = 0;

Schritt #: 5-0 = 5; Daher ist 5% 7 = 5

Yongama
quelle
1
Am Ende hättest du schreiben sollen: "Deshalb 5% 7 = 5"
Johnny
0

Der Moduloperator gibt Ihnen das Ergebnis in einem System mit reduzierten Rückständen. Zum Beispiel werden für Mod 5 5 ganze Zahlen gezählt: 0,1,2,3,4. Tatsächlich ist 19 = 12 = 5 = -2 = -9 (Mod 7) . Der Hauptunterschied, dass die Antwort durch Programmiersprachen durch "System mit reduzierten Rückständen" gegeben wird.

GokcenG
quelle
0

Sagen wir es so:
Eigentlich macht der Modulus-Operator die gleiche Unterteilung, aber die Antwort ist ihm egal, er kümmert sich um die Erinnerung, zum Beispiel, wenn Sie 7 bis 5 teilen. Lassen Sie
mich Sie durch ein einfaches Beispiel führen:
Denken Sie 5 ist ein Block, dann werden wir zum Beispiel 3 Blöcke in 15 haben ( WITH Nothing Left ), aber wenn dieser Loginc zu diesen Zahlen {1,3,5,7,9,11, ...} kommt, ist hier Wo der Modul herauskommt, nimm also die Logik, die ich vorher gesagt habe, und wende sie für 7 an. Die Antwort wird also sein, dass wir 1 Block von 5 in 7 haben => mit 2 Erinnerungen in unserer Hand! das ist der modul !!!
aber du hast nach 5% 7 gefragt, oder?
Also nimm die Logik, die ich gesagt habe, wie viele 7 Blöcke haben wir in 5 ???? 0
Der Modul gibt also 0 zurück ...
das war's ...

a_m_dev
quelle
0

Ein neuartiger Weg, um den Rest herauszufinden, ist unten angegeben

Aussage: Der Rest ist immer konstant

ex : 26 divided by 7 gives R : 5 

Dies kann leicht herausgefunden werden, indem man die Zahl findet, die 26 vollständig teilt, die näher am Teiler liegt, und die Differenz der beiden nimmt

13 ist die nächste Zahl nach 7, die 26 vollständig teilt, da nach 7 8, 9, 10, 11, 12 kommt, wobei keine von ihnen 26 vollständig teilt und den Rest 0 ergibt.

13 ist also die Zahl, die 7 am nächsten kommt und sich teilt, um den Rest 0 zu ergeben.

Nehmen Sie nun die Differenz (13 ~ 7) = 5, die der Temainder ist.

Hinweis: Damit dies funktioniert, sollte der Divisor auf seine einfachste Form reduziert werden. Beispiel: Wenn 14 der Divisor ist, muss 7 ausgewählt werden, um die nächste Zahl zu finden, die die Dividende teilt.

Pramod Bhat
quelle
Was ist so erstaunlich daran, dass Reste konstant sind? Was heißt (13 ~ 7) = 5das Der Unterschied zwischen 13 und 7 ist 6, nicht 5. Was bedeutet "wenn 14 der Teiler ist, muss 7 gewählt werden"? Die Antwort macht keinen Sinn und liefert kein korrektes Ergebnis.
user207421
0

Wie Sie sagen, wird das% -Zeichen verwendet, um den Modul (Teilungsrest) zu nehmen.

Auf der JavaScript-Arithmetik-Seite von w3schools können wir im Abschnitt Rest lesen, was ich für eine gute Erklärung halte

In der Arithmetik ergibt die Division zweier Ganzzahlen einen Quotienten und einen Rest .

In der Mathematik ist das Ergebnis einer Modulo-Operation der Rest einer arithmetischen Division.

Wenn Sie also in Ihrem speziellen Fall versuchen, 7 Bananen in eine Gruppe von 5 Bananen zu unterteilen, können Sie 1 Gruppe von 5 (Quotient) erstellen und es bleiben 2 Bananen (Rest) übrig.

Wenn 5 Bananen zu einer Gruppe von 7 gehören, können Sie das nicht und Sie haben wieder die 5 Bananen (Rest).

Tiago Martins Peres 李大仁
quelle