slakmann: kleinster gemeinsamer teiler mit modulo

hallo,
ich wollte mit hilfe von modulo ein javascript schreiben, welches von 2 zahlen den kleinsten gemeinsamen teiler ermittelt (1 ausgenommen; also ab 2).
meine lösung siehe unten.
nur ich habe ein problem:
er gibt immer die zahl aus, die ich bei der for-schleife bei i definiert habe +1. also ich fange (wie im bsp. i=2 an, gibt er IMMER 3 aus. i=3 gibt er immer 4 aus und i=1 gibt er immer 2 aus.
meiner meinung nach müsste das script logisch korrekt sein. bitte helft mir.
danke.

<html>
  <head>
    <title>Modulo einer Zahl</title>
    <script language="javascript">
    <!--
    function fenster()
    {
      var zahl1 = Number(document.eingabe.zahl1.value);
      var zahl2 = Number(document.eingabe.zahl2.value);

/* erg1+erg2 beides != 0 damit er überhaupt erstmal in die
         schleife reingeht.
      */
      var erg1 = 1;
      var erg2 = 2;

/* i fängt bei 2 an da 1 immer der kleinste gemeinsamer teiler ist.
         i zählt hoch da wir bei der ersten gefunden zahl das ergebnis haben
         und nicht mehr weiter rechnen brauchen.

erg1!=0 && erg2!=0
         Die schleife soll solange laufen, bis bei beiden rest 0 gleichzeitig
         gefunden wurde.
      */
      for (var i=2; erg1!=0 && erg2!=0; i++)
      {
        //bei beiden den rest ausrechnen.
        erg1=zahl1/i;
        erg2=zahl2/1;

// folgendes ist nur eine verhinderung einer möglichen endlosschleife.
        if( i >= zahl1)
        {
          /* Wenn der zähler größer ist als die kleinste zahl, wird er nie einen
             gemeinsamen teiler finden. ob wir zahl1 oder zahl2 abrufen ist egal
             wir brauchen nicht wissen welche die kleinere ist. weil wenn wir
             die größere erwischen, haben wir die kleinere eh schon längst
             erreicht.
             somit wird i auf 1 gesetzt und die schleife beendet.
          */
          i=1;
          break;
        }
      }
      alert ('Der kleinste gemeinsamer Teiler ist: ' + i);
    }
    -->
    </script>
    <noscript>
      Sie haben kein JavaScript aktiviert. Schämen Sie sich!
    </noscript>
  </head>
  <body>
    <h1>
      Kleinster gemeinsamer Teiler
    </h1>
    Ab 2, da 1 immer der kleinste gemeinsamer Teiler ist.<br>
    Wenn ab 2 keinen gefunden wurde, wird 1 genommen.<br><br>
    <form name="eingabe">
       <b>Zahl1:</b> &nbsp;
       <input type="text" name="zahl1" maxlength="6" size="6">
        <br>
       <b>Zahl2:</b> &nbsp;
       <input type="text" name="zahl2" maxlength="6" size="6">
         <br><br>
       <input type="submit" name="senden" value="Senden" onclick="fenster();">
       <br>
    </form>
  </body>
</html>

  1. hoppla,
    ich habe da einen kleinen tippfehler.

    es muss heißen:
            //bei beiden den rest ausrechnen.
            erg1=zahl1%i;
            erg2=zahl2&1;

    anstatt:
            //bei beiden den rest ausrechnen.
            erg1=zahl1/i;
            erg2=zahl2/1;

    hatte zwischendurch was anderes ausprobiert. trotzdem bleibt das problem bei modulo.

    1. man ey, schonwieder *grr*

      beides modulo natürlich. also:
              //bei beiden den rest ausrechnen.
              erg1=zahl1%i;
              erg2=zahl2%1;

      1. man ey, schonwieder *grr*

        beides modulo natürlich. also:
                //bei beiden den rest ausrechnen.
                erg1=zahl1%i;
                erg2=zahl2%1;

        Bist Du sicher, daß Du den _kleinsten_ gemeinsamen Teiler suchst?

        Viele Grüße,
        Reiner

        1. man ey, schonwieder *grr*

          beides modulo natürlich. also:
                  //bei beiden den rest ausrechnen.
                  erg1=zahl1%i;
                  erg2=zahl2%1;

          Bist Du sicher, daß Du den _kleinsten_ gemeinsamen Teiler suchst?

          Viele Grüße,
          Reiner

          ja weil i bei 2 anfängt und mit i++ immer höher geht. also fängt er unten an.
          und ausserdem ist das nur eine übung für mich die ich lösen will. ob es sinnvoll ist, sei dahingestellt.

          1. habe den fehler nun gefunden.
            bei dem 2. habe ich %1 anstatt %i gschrieben.

            *mitdemkopfaufdentischhau*

          2. Hallo slakmann,

            Bist Du sicher, daß Du den _kleinsten_ gemeinsamen Teiler suchst?

            ja weil ...

            der kleinste gemeinsame Teiler ist immer die Eins. Du suchst den größten gemeinsamen Teiler, den ggT, der nicht mit dem kleinsten gemeinsamen Vielfachen, dem kgV, verwechselt werden sollte.

            Gruß, Jürgen

            1. Hallo slakmann,

              Bist Du sicher, daß Du den _kleinsten_ gemeinsamen Teiler suchst?

              ja weil ...

              der kleinste gemeinsame Teiler ist immer die Eins. Du suchst den größten gemeinsamen Teiler, den ggT, der nicht mit dem kleinsten gemeinsamen Vielfachen, dem kgV, verwechselt werden sollte.

              Gruß, Jürgen

              ja ich weiss dass die 1 immer der kleinste gemeinsamer teiler ist. dann halt eben den 2. kleinsten gemeinsamen teiler. hauptsache eine übung zum lernen.

              trotzdem danke

              1. Hallo slakmann,

                ... hauptsache eine übung zum lernen.

                ach so.

                Gruß, Jürgen

  2. Moin!

    <html>  
      <head>  
        <title>Modulo einer Zahl</title>  
        <script language="javascript">
    
      
        <!--  
        function fenster()  
        {  
          var zahl1 = Number(document.eingabe.zahl1.value);  
          var zahl2 = Number(document.eingabe.zahl2.value);  
      
       // Wir brauchen höchstens bis zur  
       // Quadratwurzel der größeren Zahl zu suchen  
       // Wenn diese aber größer ist, als die kleinere der beiden Zahlen  
       // brauchen wir nur bis zu dieser kleineren Zahl zu suchen  
       var max;  
       if ( zahl1 > zahl2 ) {  
        max= Math.floor( Math.sqrt( zahl1 ));  
        if ( max > zahl2 ) {  
         max= zahl2;  
        }  
       }  
       else {  
        max= Math.floor( Math.sqrt( zahl2 ));  
        if ( max > zahl1 ) {  
         max= zahl1;  
        }  
       }  
      
       var kgt= 1;  
       // Ab 3 önnen wir in 2er Schritten weitersuchen  
       var step= 1;  
          for (var i=2; i<=max; i+= step, step=2)  
          {  
            //bei beiden den rest ausrechnen.  
            var erg1=zahl1 % i;  
            var erg2=zahl2 % i;  
      
        if ( erg1==0 && erg2==0 ) { // Lösung gefunden  
         kgt= i;  
         break;  
        }  
          }  
          alert ('Der kleinste gemeinsamer Teiler ist: ' + kgt);  
        }  
        -->  
        
    
    </script>  
        <noscript>  
          Sie haben kein JavaScript aktiviert. Schämen Sie sich!  
        </noscript>  
      </head>  
      <body>  
        <h1>  
          Kleinster gemeinsamer Teiler  
        </h1>  
        Ab 2, da 1 immer der kleinste gemeinsamer Teiler ist.<br>  
        Wenn ab 2 keinen gefunden wurde, wird 1 genommen.<br><br>  
        <form name="eingabe">  
           <b>Zahl1:</b> &nbsp;  
           <input type="text" name="zahl1" maxlength="6" size="6">  
            <br>  
           <b>Zahl2:</b> &nbsp;  
           <input type="text" name="zahl2" maxlength="6" size="6">  
             <br><br>  
           <input type="submit" name="senden" value="Senden" onclick="fenster();">  
           <br>  
        </form>  
      </body>  
    </html>
    

    -- Skeeve

    1. Moin!

      Korrektur! Wir können nicht bis zur Quadratwurzel suchen, wenn wir nicht den Schleifeninhalt ändern. Wir müssen bis zum Minimum von Zahl1 und Zahl2 suchen!

      Also ändere

      // Wir brauchen höchstens bis zur
         // Quadratwurzel der größeren Zahl zu suchen
         // Wenn diese aber größer ist, als die kleinere der beiden Zahlen
         // brauchen wir nur bis zu dieser kleineren Zahl zu suchen
         var max;
         if ( zahl1 > zahl2 ) {
          max= Math.floor( Math.sqrt( zahl1 ));
          if ( max > zahl2 ) {
           max= zahl2;
          }
         }
         else {
          max= Math.floor( Math.sqrt( zahl2 ));
          if ( max > zahl1 ) {
           max= zahl1;
          }
         }

        
      zu  
      ~~~javascript
        
      var max= zahl1 > zahl2 ? zahl2 : zahl1;  
      
      

      -- Skeeve

    2. Hallo Skeeve,

      <noscript>
            Sie haben kein JavaScript aktiviert. Schämen Sie sich!
          </noscript>
        </head>

      Der noscript-Bereich enthält nur Text bzw. HTML-Code und sollte daher nicht im head-, sondern im body-Bereich liegen.

      <body>
          <h1>
            Kleinster gemeinsamer Teiler
          </h1>
          Ab 2, da 1 immer der kleinste gemeinsamer Teiler ist.<br>
          Wenn ab 2 keinen gefunden wurde, wird 1 genommen.<br><br>

      also wird er zweitkleinste Teiler gesucht. Immerhin besser als in der Politik, die ja (fast) immer mit dem kleinsten gemeinsamen Nenner zufrieden ist.

      Gruß, Jürgen

      1. Moin, Jürgen!

        Der noscript-Bereich enthält nur Text bzw. HTML-Code und sollte daher nicht im head-, sondern im body-Bereich liegen.

        Erzähl das nicht mir sondern dem OP.

        also wird er zweitkleinste Teiler gesucht. Immerhin besser als in der Politik, die ja (fast) immer mit dem kleinsten gemeinsamen Nenner zufrieden ist.

        Erzähl das nicht mir sondern dem OP.

        ;-)

        -- Skeeve

  3. Hi!

    /* Wenn der zähler größer ist als die kleinste zahl, wird er nie einen
                 gemeinsamen teiler finden. ob wir zahl1 oder zahl2 abrufen ist egal
                 wir brauchen nicht wissen welche die kleinere ist. weil wenn wir
                 die größere erwischen, haben wir die kleinere eh schon längst
                 erreicht.

    GANZ schlechter Programmierstil. Wenn eine Zahl jetzt exorbitant größer ist als die andere, läuft die Schleife unnötig oft durch. Bsp.: Zahl eins ist 9231298464413382391, Zahl zwei ist 2.

    mfG

    --
    sh:( fo:§ ch:{ rl:? br:> n4:# ie:} mo:? va:) de:µ zu:| fl:( ss:{ ls:~ js:)
    "And all those exclamation marks, you notice? Five? A sure sign of someone who wears his underpants on his head."
    (Terry Pratchett)
    1. Hi!

      /* Wenn der zähler größer ist als die kleinste zahl, wird er nie einen
                   gemeinsamen teiler finden. ob wir zahl1 oder zahl2 abrufen ist egal
                   wir brauchen nicht wissen welche die kleinere ist. weil wenn wir
                   die größere erwischen, haben wir die kleinere eh schon längst
                   erreicht.
      GANZ schlechter Programmierstil. Wenn eine Zahl jetzt exorbitant größer ist als die andere, läuft die Schleife unnötig oft durch. Bsp.: Zahl eins ist 9231298464413382391, Zahl zwei ist 2.

      mfG

      ja ich weiss. das war mir auch bewusst. nur war es erstmal für mich so einfacher.
      als das problem beseitigt war, habe ich diese überprüfung selbstverständlich mit eingebaut.

  4. Moin!

    Noch 'ne Variante:

    <html>  
      <head>  
        <title>Modulo einer Zahl</title>  
        <script language="javascript">
    
      
        <!--  
      function ggt(a, b) {  
       if ( b == 0 ) {  
        return a;  
       }  
       return ggt( b, a % b );  
      }  
      
      function fenster()  
        {  
          var zahl1 = Number(document.eingabe.zahl1.value);  
          var zahl2 = Number(document.eingabe.zahl2.value);  
      
       var kgt= ggt(zahl1, zahl2);  
       var max= Math.sqrt(kgt);  
       // Ab 3 können wir in 2er Schritten weitersuchen  
       var step= 1;  
          for (var i=2; i<=max; i+= step, step=2)  
          {  
            if ( kgt % i == 0 ) { // Lösung gefunden  
         kgt= i;  
         break;  
        }  
          }  
          alert ('Der kleinste gemeinsamer Teiler ist: ' + kgt);  
        }  
        -->  
        
    
    </script>  
        <noscript>  
          Sie haben kein JavaScript aktiviert. Schämen Sie sich!  
        </noscript>  
      </head>  
      <body>  
        <h1>  
          Kleinster gemeinsamer Teiler  
        </h1>  
        Ab 2, da 1 immer der kleinste gemeinsamer Teiler ist.<br>  
        Wenn ab 2 keinen gefunden wurde, wird 1 genommen.<br><br>  
        <form name="eingabe" onsubmit="return false">  
           <b>Zahl1:</b> &nbsp;  
           <input type="text" name="zahl1" maxlength="6" size="6">  
            <br>  
           <b>Zahl2:</b> &nbsp;  
           <input type="text" name="zahl2" maxlength="6" size="6">  
             <br><br>  
           <input type="submit" name="senden" value="Senden" onclick="fenster();">  
           <br>  
        </form>  
      </body>  
    </html>
    

    -- Skeeve