webentwicklung-frage-antwort-db.com.de

Erkennen, wann der Modulus-Operator verwendet wird

Ich weiß, dass der Operator modulus (%) den Rest einer Division berechnet. Wie kann ich eine Situation identifizieren, in der ich den Modulus-Operator verwenden müsste?

Ich weiß, dass ich den Modulus-Operator verwenden kann, um zu sehen, ob eine Zahl gerade oder ungerade ist, eine Primzahl oder ein zusammengesetzter Wert. Ich denke nicht oft in Form von Resten. Ich bin sicher, dass der Modulus-Operator nützlich ist, und ich möchte lernen, ihn zu nutzen. 

Ich habe nur Probleme, zu ermitteln, wo der Modulus-Operator anwendbar ist. In verschiedenen Programmiersituationen fällt es mir schwer, ein Problem zu erkennen und zu realisieren, "Hey! Der Rest der Division würde hier funktionieren!".

53
Codebug

Stellen Sie sich vor, Sie haben eine verstrichene Zeit in Sekunden und möchten diese in Stunden, Minuten und Sekunden umrechnen:

h = s / 3600;
m = (s / 60) % 60;
s = s % 60;
25
Paul R
0 % 3 = 0;
1 % 3 = 1;
2 % 3 = 2;
3 % 3 = 0;

Hast du gesehen, was es getan hat? Im letzten Schritt ging es wieder auf Null zurück. Dies kann in folgenden Situationen verwendet werden:

  1. Um zu prüfen, ob N durch M teilbar ist (zum Beispiel ungerade oder gerade) Oder N ist ein Vielfaches von M.

  2. Eine Obergrenze für einen bestimmten Wert setzen. In diesem Fall 3.

  3. Die letzten M Ziffern einer Zahl erhalten -> N% (10 ^ M).
19
SysAdmin

Ich benutze es für Fortschrittsbalken und ähnliches, wie der Fortschritt durch eine große Schleife verläuft. Der Fortschritt wird nur jedes n-te Mal in der Schleife gemeldet oder wenn count% n == 0 ist.

16
SeaDrive

Ich habe es benutzt, um eine Zahl auf ein bestimmtes Vielfaches zu beschränken:

temp = x - (x % 10); //Restrict x to being a multiple of 10
11
Bob
  • Werte umbrechen (wie eine Uhr).
  • Stellen Sie endliche Felder für symmetrische Schlüsselalgorithmen bereit.
  • Bitweise Operationen.

Und so weiter.

10
jweyrich

Konvertieren einer linearen Datenstruktur in eine Matrixstruktur: Dabei ist a der Index linearer Daten und b die Anzahl der Elemente pro Zeile:

row = a/b
column = a mod b

Der obige Hinweis ist eine vereinfachte Logik: a muss vor dem Dividieren um -1 versetzt und das Ergebnis muss normalisiert werden +1.

Beispiel: (3 Reihen von 4)

1  2  3  4    
5  6  7  8    
9 10 11 12 

(7 - 1)/4 + 1 = 2

7 is in row 2

(7 - 1) mod 4 + 1 = 3 

7 is in column 3

Eine weitere häufige Verwendung des Moduls: Hashing einer Zahl nach Ort. Angenommen, Sie möchten das Jahr und den Monat in einer sechsstelligen Zahl 195810 speichern. month = 195810 mod 100 alle 3. Ziffern von rechts sind durch 100 teilbar. Der Rest ist also die 2 rechten Ziffern. In diesem Fall ist der Monat 10. Das Jahr 195810 / 100 ergibt 1958.

4
Joe

Beispiel. Sie haben eine Nachricht von X Bytes, aber in Ihrem Protokoll ist die maximale Größe Y und Y <X. Versuchen Sie, eine kleine App zu schreiben, die die Nachricht in Pakete aufteilt.

4
Andrey

Wenn Sie eine Division haben und den Rest anders als in Dezimalzahlen ausdrücken möchten, ist der Mod-Operator geeignet. Dinge, die mir in den Sinn kommen, sind im Allgemeinen, wenn Sie mit dem Rest etwas für den Menschen lesbares tun möchten. Aufzählen, wie viele Artikel Sie in Eimer legen könnten und sagen "5 übrig" ist gut.

Auch wenn Sie sich in einer Situation befinden, in der Sie Rundungsfehler haben können, ist die Modulo-Division gut. Wenn Sie oft durch 3 dividieren, möchten Sie nicht .33333 als Rest übergeben. Das Passieren des Restes und des Divisors (d. H. Des Bruchteils) ist angemessen. 

3
Matt

Ein Anwendungsfall, den ich kürzlich gesehen habe, war, wenn Sie eine Nummer stornieren müssen. So wird aus 123456 beispielsweise 654321.

int number   = 123456;
int reversed = 0;

while ( number > 0 ) {
    # The modulus here retrieves the last digit in the specified number
    # In the first iteration of this loop it's going to be 6, then 5, ...
    # We are multiplying reversed by 10 first, to move the number one decimal place to the left.
    # For example, if we are at the second iteration of this loop, 
    #  reversed gonna be 6, so 6 * 10 + 12345 % 10 => 60 + 5
    reversed = reversed * 10 + number % 10;
    number = number / 10;
}
3
JCM

Wie @jweyrich sagt, Werte einpacken. Ich habe Mod sehr praktisch gefunden, wenn ich eine endliche Liste habe und ich in einer Schleife darüber iterieren möchte - wie eine feste Liste von Farben für einige UI-Elemente, wie Chart-Serien, bei denen ich alle Serien unterschiedlich sein möchte Soweit es möglich ist, aber wenn mir die Farben ausgehen, fange ich einfach von vorne an. Dies kann beispielsweise auch mit Mustern verwendet werden, so dass beim zweiten Mal, wenn Rot erscheint, es gestrichelt ist. das dritte mal, gepunktet usw. - aber mod wird nur verwendet, um rot, grün, blau, rot, grün, blau für immer zu erhalten.

3
Carl Manaster

Berechnung der Primzahlen

3
anonymous

Das Modulo kann nützlich sein, um die Gesamtminuten in Stunden und Minuten umzuwandeln:

stunden = Minuten/60 

minutes_left = Minuten% 60

Im Stundenbit müssen wir den Dezimalanteil entfernen, und das hängt von der verwendeten Sprache ab.

Wir können dann die Ausgabe entsprechend neu anordnen.

3
tony

Der Modulus ist auch sehr nützlich, wenn Sie aus irgendeinem verrückten Grund eine Ganzzahldivision durchführen und eine Dezimalstelle erhalten möchten und die Ganzzahl nicht in eine Zahl konvertieren können, die die Dezimaldivision unterstützt, oder wenn Sie einen Bruch anstelle einer Dezimalzahl zurückgeben müssen .

Ich werde % als Modulus-Operator verwenden

Zum Beispiel

2/4 = 0

wo dies geschieht

2/4 = 0 and 2 % 4 = 2

Sie können also wirklich verrückt sein und sagen, dass Sie dem Benutzer die Eingabe eines Zählers und eines Divisors gestatten und das Ergebnis als ganze Zahl und dann als Bruchzahl anzeigen sollen.

whole Number = numerator/divisor
fractionNumerator = numerator % divisor
fractionDenominator = divisor

Ein weiterer Fall, in dem die Modulteilung hilfreich ist, ist, wenn Sie eine Zahl erhöhen oder verringern und die Zahl auf einen bestimmten Zahlenbereich beschränken möchten, aber wenn Sie oben oder unten ankommen, möchten Sie nicht einfach aufhören. Sie möchten entweder bis zum Ende oder oben in der Liste durchlaufen.

Stellen Sie sich eine Funktion vor, bei der Sie ein Array durchlaufen.

Function increase Or Decrease(variable As Integer) As Void
    n = (n + variable) % (listString.maxIndex + 1)  
    Print listString[n]
End Function

Der Grund dafür, dass es sich um n = (n + variable)% (listString.maxIndex + 1) handelt, besteht darin, dass der max-Index berücksichtigt werden kann.

Dies sind nur einige der Dinge, die ich bei der Programmierung von Desktop-Anwendungen, aber auch in Robotik- und Simulationsumgebungen verwenden musste.

2
msarchet

Meine Lieblingsanwendung ist die Iteration.

Angenommen, Sie haben einen Zähler, den Sie inkrementieren, und möchten dann aus einer bekannten Liste die entsprechenden Elemente abrufen. Sie können jedoch nur aus n Elementen auswählen und möchten einen Zyklus wiederholen.

var indexFromB = (counter-1)%n+1;

Ergebnisse (counter=indexFromB) gegeben n=3:

`1=1`
`2=2`
`3=3`
`4=1`
`5=2`
`6=3`
...
2
Nateous

So können Sie leicht feststellen, ob eine Zahl gerade oder ungerade ist. Mach einfach # mod 2, wenn es 0 ist, ist es gerade, 1 ist ungerade.

2
user1671033

Es gibt viele Fälle, in denen es nützlich ist. 

Wenn Sie eine Zahl auf einen bestimmten Bereich beschränken müssen, können Sie mod verwenden. Um zum Beispiel eine Zufallszahl zwischen 0 und 99 zu generieren, könnte man sagen:

num = MyRandFunction() % 100;
2
Justin Ethier
  • Berechnung des größten gemeinsamen Teilers
  • Bestimmen, ob eine Zahl ein Palindrom ist
  • Bestimmen, ob eine Zahl nur aus ... besteht 
  • Bestimmen, wie viele ... eine Zahl besteht aus ...
2
helpermethod

Die beste Verwendung des Modulusoperators, den ich gesehen habe, ist zu überprüfen, ob das Array, das wir haben, eine gedrehte Version des ursprünglichen Arrays ist. 

A = [1,2,3,4,5,6] B = [5,6,1,2,3,4]

Wie kann man nun überprüfen, ob die gedrehte Version von A ist? 

Schritt 1: Wenn die Länge von A nicht mit der von B identisch ist, handelt es sich sicher nicht um eine gedrehte Version. 

Schritt 2: Überprüfen Sie den Index des ersten Elements von A in B. Hier ist das erste Element von A 1. Und sein Index in B ist 2 (vorausgesetzt, Ihre Programmiersprache hat einen auf Null basierenden Index). Schlüssel

Schritt 3: Wie kann man nun überprüfen, ob die Version von A wie in B gedreht wird?

Hier schaukelt die Modulus-Funktion: 

for (int i = 0; i< A.length; i++)
{

// here modulus function would check the proper order. Key here is 2 which we recieved from Step 2
   int j = [Key+i]%A.length;

   if (A[i] != B[j])
   {
     return false;
   }
}

return true;