Charlie: MOD bzw. %

HI,

ich habe eine Berechnung auszuprogrammieren, bei der die 1. zahl mit 1 multipliziert wird die 2. mit 2 und die 3. mit 3 und dies fortlaufend.
Da die Zahl auch 30 Stellen aufweisen kann, hab ich mir gedacht ich mach mal einfach eine Schleife über die Länge der Zahl:
for ($loop = 1; $loop <= strlen($n); $loop=$loop + 1)
und zB bei jeder 3. Zahl müsste es ja eigentlich so funtkionieren:
if ($loop % 3)
und bei jeder 2.Zahl so:
else if ($loop % 2)
und bei jeder 1.Zahl einfach:
else
aber leider funkt dies überhaupt nicht.
Was mach ich falsch bzw. was ist mein Denkfehler.

danke+lg
Charlie

  1. Hi Charlie,

    sorry, es ist nicht ganz nachvollziehbar, was Du machen möchtest

    ich habe eine Berechnung auszuprogrammieren, bei der die 1. zahl mit 1 multipliziert wird die 2. mit 2 und die 3. mit 3 und dies fortlaufend.

    hier habe ich gedacht, Du gibt nach und nach mehrere Zahlen ein und multiplizierst diese jeweilig mit ihrer Stelle

    Da die Zahl auch 30 Stellen aufweisen kann, hab ich mir gedacht ich mach mal einfach eine Schleife über die Länge der Zahl:

    ist die zahl in einem String, damit Du die Länge mit strlen prüfen kannst?

    for ($loop = 1; $loop <= strlen($n); $loop=$loop + 1)
    und zB bei jeder 3. Zahl müsste es ja eigentlich so funtkionieren:
    if ($loop % 3)

    wo ist die Bedingung? $loop%3 ergibt ein Ergebnis, womit prüfst Du es?

    Vielleicht wäre es ganz gut, wenn Du mal ein Beispiel brächtest.
    Die Zahl, die Du eingeben willst und das Ergebnis, welches entstehen soll.

    ciao
    romy

  2. Hallo Charlie!

    und zB bei jeder 3. Zahl müsste es ja eigentlich so funtkionieren:
    if ($loop % 3)
    und bei jeder 2.Zahl so:
    else if ($loop % 2)

    Was mach ich falsch bzw. was ist mein Denkfehler.

    Der Modulo-Operator gibt ja den Rest in Form eines Integer zurück.
    Deine if-Konstruktion erwartet einen boolschen Ausdruck.

    Und da sind wir beim Problem:
    Bei jeder dritten Zahl gibt $loop % 3 vermutlich 0 zurück.
    Dieser Integer 0 wird dann in einen Boolean konvertiert. Wie Du aus dem Manual (siehe unten angeführte Links) erfahren kannst, wird 0 zu false.

    Dein Ausdruck müßte meiner Ansicht nach also z.B. $loop % 3 == 0 heißen.
    Das würde bei Rest 0 dann true zurückgeben und das ist es ja, was Du willst.

    Siehe auch PHP Manual: Arithmetic Operators und PHP Manual: Types: Booleans und PHP Manual: Appendix O. PHP type comparison tables.

    MfG
    Götz

    --
    Losung für Mittwoch, 29. Dezember 2004
    Gleichwie ich über sie gewacht habe, auszureißen und einzureißen, so will ich über sie wachen, zu bauen und zu pflanzen, spricht der Herr. (Jeremia 31,28)
    Seid nun geduldig, bis zum Kommen des Herrn. Siehe, der Bauer wartet auf die kostbare Frucht der Erde und ist dabei geduldig, bis sie empfange den Frühregen und Spätregen. (Jakobus 5,7)
    (Losungslink)
    1. Hallo Götz!

      Danke für deine Antwort:

      Dein Ausdruck müßte meiner Ansicht nach also z.B. $loop % 3 == 0 heißen.
      Das würde bei Rest 0 dann true zurückgeben und das ist es ja.

      Also muß ich es so aufbauen:
      if ($loop % 3 == 0)
      damit immer nur die Zahl genommen wird die durch 3 teilbar ist
      und
      else if ($loop % 2 == 0)
      damit immer nur die Zahl genommen wird die durch 2 teilbar ist.

      lg
      Charlie

  3. Hallo,

    ich habe eine Berechnung auszuprogrammieren, bei der die 1. zahl mit 1 multipliziert wird die 2. mit 2 und die 3. mit 3 und dies fortlaufend.

    Das klingt fuer mich nach diesem Ansatz:

    <?php

    $zahl=123456789;
    $tmp=strval($zahl);
    $erg=0;
    for($i=0;$i<strlen($tmp);$i++)$erg+=$tmp{$i}*($i+1);
    print $erg; // 285 = 1*1+2*2+3*3+4*4+5*5+6*6+7*7+8*8+9*9

    ?>

    MfG, Thomas

    1. [Nachtrag:]

      Das klingt fuer mich nach diesem Ansatz:

      <?php

      $zahl=123456789;
      $tmp=strval($zahl);

      // oder eher das?
         for($i=0;$i<strlen($tmp);$i++)print $tmp{$i}*($i+1)."<br>";

      ?>

      MfG, Thomas

    2. Hallo Thomas,

      Das klingt fuer mich nach diesem Ansatz:

      <?php

      $zahl=123456789;
      $tmp=strval($zahl);
      $erg=0;
      for($i=0;$i<strlen($tmp);$i++)$erg+=$tmp{$i}*($i+1);
      print $erg; // 285 = 1*1+2*2+3*3+4*4+5*5+6*6+7*7+8*8+9*9

      ?>

      sorry, da hab ich leider etwas vergessen.
      die Multiplikation und Addition ist immer fortlaufend mit 1,2,3 also zuerst mit 1 dann mit 2 dann mit 3 dann wieder mit 1 und 2 und 3 usw.
      mein kl. Problem ist jetzt nur, dass hierbei:
        for ($loop = 1; $loop <= strlen($n); $loop++){
         if ($loop % 3 == 0){
          $z[$loop] = (((substr($n, $loop-1, 1) * 3) + 3) % 11);
         }
         else if ($loop % 2 == 0){
          $z[$loop] = (((substr($n, $loop-1, 1) * 2) + 2) % 11);
          $zahl4=substr($n, $loop-1, 1);
          $test2=$z[$loop];
         }
         else{
          $z[$loop] = (((substr($n, $loop-1, 1) * 1) + 1) % 11);
         }
        }

      leider auch die 4. zahl mit 2 multiplieziert und addiert wird, aber es soll mit 1 multipliziert und addiert werden.

      lg
      Charlie

      1. Hallo,

        sorry, da hab ich leider etwas vergessen.
        die Multiplikation und Addition ist immer fortlaufend mit 1,2,3 also zuerst mit 1 dann mit 2 dann mit 3 dann wieder mit 1 und 2 und 3 usw.

        Mache das mal an einem Zahlenbeispiel klar!

        MfG, Thomas

        1. Hi,

          Mache das mal an einem Zahlenbeispiel klar!

          ok hier das Zahlenbeispiel:
          1 3 8 3 0
          1 mit 1 multiplizieren und dann 1 addieren und den Modulus 11 ermitteln
          Ergebnis:2
          3 mit 2 multiplizieren und dann 2 addieren und den Modulus 11 ermitteln
          Ergebnis:8
          8 mit 3 multiplizieren und dann 3 addieren und den Modulus 11 ermitteln
          Ergebnis:5
          3 mit 1 multiplizieren und dann 1 addieren und den Modulus 11 ermitteln
          Ergebnis:4
          0 mit 2 multiplizieren und dann 2 addieren und den Modulus 11 ermitteln
          Ergebnis:2

          Die Zahl kann aber auch so aussehen:
          38459362838749
          also viel mehr Stellen haben!

          danke+lg
          Charlie

          1. Hallo,

            Mache das mal an einem Zahlenbeispiel klar!

            ok hier das Zahlenbeispiel:

            Also das?

            <?php

            $zahl=13830;
            $tmp=strval($zahl);
            $j=0;
            for($i=0;$i<strlen($tmp);$i++)
            {
              $j++;
              if($j==4)$j=1;
              print ($tmp{$i}*$j+$j)%11 . "<br>";
            }

            ?>

            ergibt: 2|8|5|4|2 fuer 13830
            und 4|7|4|6|9|1|7|6|5|4|7|2|5|9 fuer 38459362838749

            (<br> mal durch | ersetzt)

            MfG, Thomas

            1. Hi Thomas,

              Also das?

              vielen Dank.
              Bist mein Held für den heutigen Tag.

              lg
              Charlie