MOD bzw. %
Charlie
- php
0 romy0 Götz0 Charlie
0 Thomas Meinike0 Thomas Meinike0 Charlie
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
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
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
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
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
[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
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
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
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
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
Hi Thomas,
Also das?
vielen Dank.
Bist mein Held für den heutigen Tag.
lg
Charlie