Frage zu % (Modula)



  • die 1 lässt sich nicht durch 4 teilen, deswegen ist der rest 1.



  • Btw: Der Operator nennt sich Modulo. Das von dir genannte Wort ist der Name einer - hrm - etwas angestaubten Programmiersprache (o;

    -junix



  • [EDIT]Zu spät...[/EDIT]

    Modulo sucht wie du schon erkannt hast immer das kleinste Vielfache von zahl2, das kleiner als zahl1 ist. Die Differenz dieser beiden Zahlen ist das Ergebnis.
    Bei 1%4 läuft das dann folgendermaßen ab:

    int i=0;
    while(i*zahl2 <= zahl1)
        ++i;
    // i ist jetzt um 1 zu groß, also muss man jetzt mit i-1 rechnen
    return (i-1)*zahl2 - zahl1;
    


  • Ja, 4 passt 0 mal in 1. Deshalb kommt auch 1 raus (1-0=1)
    Stell dir das so vor: zuerst schaut man, wie oft der zweite operand in den ersten passt (bei 1 % 4 passt 4 0 mal in 1). Dann multipliziert man das ergebnis mit dem zweiten operanden (0 * 4 = 0). Und dann zieht man den ersten operanden von diesem ergebnis ab.
    Ich hoffe du bist nicht zu verwirrt 🙄
    Bsp: 42 % 15
    15 passt 2 mal in 42
    2 mal 15 ist 30
    42 - 30 = 12

    In wirklichkeit macht die Cpu das glaubich anders. So versuch ich mir das immer vorzustellen. (Ich weiß, es ist seeehr umständlich 🙂 )
    geloescht

    EDIT: auch zu spät



  • @CME386: Das liesse sich auch eleganter machen (o;

    int modulo(int zahl_int, int teiler_int)
    {
        while (zahl_int >= teiler_int)
            zahl_int -= teiler_int;
    
        return zahl_int;
    }
    

    (o;

    -junix

    [edit]oder nicht so schön lesbar:

    int modulo(int zahl_int, int teiler_int)
    {
        return zahl_int - ((zahl_int/teiler_int)*zahl_int);
    }
    

    --untested, no warranties (o:--



  • Das zweite find ich ein wenig unpassend, weil der Fragesteller (wie es aussieht) ein Programmierneuling ist, und dann sollte man meistens (wenn es keine Verschlechterungen z.B. durch Sicherheitsrisikos gibt) die einfachste Möglichkeit posten. Aber die erste gefällt mir 👍



  • Naja, die zweite ist hald eher die mathematische, die erste eher die Bruteforce Lösung... Daher ist die 2. vermutlich schneller als die 1. (nehmen wir eine ungünstige Konstellation wie z.B. zahl_int = 100000, teiler_int = 3. Das bedeutet konkret 33 333 Durchläufe bis zum resultat.... Aber du hast recht. in der ersten wird eher verdeutlicht, was der Operator "%" eigentlich macht (o:

    -junix



  • warum alles so kompliziert?

    Modulo gibt nichts weiter als den Rest einer Division zwei ganzer Zahlen aus!



  • Weil du ein wenig an der Fragestellung vorbeigeschrammt bist. :p



  • matheix schrieb:

    servus,

    zahl1 % zahl2 bedeutet doch teile zahl1 durch zahl2 und sag mir was übrig bleibt. sprich 4 % 2 = 0; 4 % 3 = 1 (da 3 einmal in 4 passt und 1 übrig bleibt).

    komischerweise gibt aber 1%4 auch 1 und das ist mir nicht ganz klar!
    die 4 passt doch 0mal in die 1, es müsste somit doch eigentlich 0 und nicht 1 das ergebniss sein, oder ???

    das ist die Frage.

    CME386 schrieb:

    Weil du ein wenig an der Fragestellung vorbeigeschrammt bist. :p

    Antwort: Modulo gibt immer den Rest einer Division zweier ganzen Zahlen aus. 1/4 ist immer noch 0 Rest 1

    übrigens ist Modulo eine reine mathematische Funktion und hat nichts mit der Programmiersprache zutun! 😉



  • Online schrieb:

    matheix schrieb:

    zahl1 % zahl2 bedeutet doch teile zahl1 durch zahl2 und sag mir was übrig bleibt. sprich 4 % 2 = 0; 4 % 3 = 1 (da 3 einmal in 4 passt und 1 übrig bleibt).

    Hierauf antwortest du, obwohl das nicht die Frage ist, mit

    Modulo gibt nichts weiter als den Rest einer Division zwei ganzer Zahlen aus!

    Das ist eigentlich dasselbe, was matheix gesagt hat, nur in einer anderen Form. Also hat matheix die Funktion Modulo-Division verstanden.

    Auf die eigentliche Frage

    matheix schrieb:

    komischerweise gibt aber 1%4 auch 1 und das ist mir nicht ganz klar!
    die 4 passt doch 0mal in die 1, es müsste somit doch eigentlich 0 und nicht 1 das ergebniss sein, oder ???

    gehst du nicht ein.

    matheix hat die Modulo-Division an sich verstanden, nur hat er einen kleinen Denkfehler bei der Form a%b bei a < b gehabt.



  • CME386 schrieb:

    matheix hat die Modulo-Division an sich verstanden, nur hat er einen kleinen Denkfehler bei der Form a%b bei a < b gehabt.

    Im Grunde hat er es ja nicht wirklich verstanden den Modulo gibt immer den Rest für ganze Zahlen an, egal a < b oder a > b ist.

    Aber ich meinte ja in grunde, das die Erklärung mit Code-Beispielen kompliziert ist, die hier genant werden. Das ist ja kein C++-Problem sondern ein Problem des mathematischen Verständnisses.



  • Aber es wurde im C++-Forum gepostet.

    Online schrieb:

    Im Grunde hat er es ja nicht wirklich verstanden den Modulo gibt immer den Rest für ganze Zahlen an, egal a < b oder a > b ist.

    Das war mir auch klar, bloß matheix halt nicht. Für a > b hat er es aber verstanden.

    BTW: Wieso ist die Erklärung mit Code-Beispielen kompliziert??? Da sieht man am besten, wie so etwas funktioniert, weil es keine reine Theorie ist.


Anmelden zum Antworten