Quersumme und Schleifen - ich verstehe es nicht...

Claudia1986

Grünschnabel
Hallo zusammen,

ich stehe vor einem Problem welches ich alleine einfach nicht hinbekomme. Seit gut acht Stunden sitze ich daran und bin, bis auf Fehlermeldungen, nicht einen Schritt weitergekommen.

Aus einer beliebig langen Zahl muss ich die Quersumme ziehen die den Wert von 44 nicht übersteigen darf. Tut sie es dennoch, muss wieder die Quersumme gezogen werden bis eben die 44 erreicht wurde. Ich bekomme es zwar mit einer if-else Anweisung hin, muss aber dafür auch jedes Mal die Funktion wieder erneut einbauen.

Das mit der while Schleife bekomme ich einfach nicht auf die Reihe.

Könnte mir bitte jemand helfen? :(
 
Das kannst du rekursiv lösen oder eine gesonderte Funktion schreiben, die die Quersumme errechnet und in eine while einbauen.

Vielleicht fragst du dich was rekursiv ist.
Hier zum Beispiel eine Funktion die rekursiv die Quersumme errechnet:
PHP:
function quer($zahl)
{
  // Abbruch-Bedingung
  if ($zahl == 0)
  {
    return 0;
  }
  // Rekursion (Funktion ruft sich auf bis zur Abbruchbedingung)
  return ($zahl % 10) + quer((int) $zahl / 10)
}

$zahl % 10 : % heißt Modulo (Rest). Zum Beispiel 1 % 3 = 1; 2 % 3 = 2; 3 % 3 = 0 (kein Rest). So kriegst du die letzte Ziffer einer Zahl mit 12345 % 10 = 5

(int) $zahl / 10 bedeutet, dass die Zahl durch 10 geteilt wird und die Nachkommastelle wird durch (int) (dies ist ein Type-Cast) einfach abgeschnitten.

Nun hast du eine Funktion die zeigt was rekursion ist anhand der Quersumme.
Du kannst es selbst nun mit einer rekursiven Funktion versuchen oder ganz stumpf eine while bauen mit der Abbruchbedingung (kleiner 44), wobei aber der Lerneffekt ausbleibt :p

Letzteres ist glaube ich das was du gerade Versuchst, wo ich eigentlich kein Problem sehe ;) zeige doch deinen Quelltext mal.
 
Zuletzt bearbeitet:
Hi.

Evlt. solltest du mal sagen was eigentlich das Problem ist? Bekommst du Fehlermeldungen? Oder eine Endlosschleife?

Probier's mal so:
PHP:
do {
  $quer = quersumme($zahl);
  $zahl = $quer;
} while ($quer > 44);
Gruß
 
Oder iterativ:
PHP:
function quer($zahl)
{
	$summe = 0;
	while ($zahl > 0) {
		$summe += ($zahl % 10);
		$zahl = (int) $zahl / 10;
	}
	return $summe;
}
 
Bitte nicht lachen wenn Fehler drin sind, aber ich bin eine totale Anfängerin was php angeht - befasse mich gerade mal drei Tage damit. Die Funktion habe ich im Netz gefunden, nur wirklich nachvollziehen was da geschieht? Nicht so richtig und ja, ein Schleife würde mir weiterhelfen, aber wie mache ich es?

PHP:
<?
 
$zahl = "658955556228465156";
 
function quersumme($zahl)
{
  settype($zahl, "string");
  $res = 0;
  for($i=0; $i<strlen($zahl); $i++)
  {
    $res = $res + $zahl[$i];
  }
  return $res;
}

$zahl2 = quersumme($zahl);

while($zahl > '22')

	{ 
	echo "$zahl<br>";
	quersumme($zahl); 
	
	}
else { echo"$zahl"; }

?>
 
Diese Funktion ruft die einzelnen Zahlen auf (mit $zahl[$i]). In der Schleife wird einfach hochgezählt von der ersten Zahl ($zahl[0]) bis zum ende des Strings ($zahl[strlen($zahl)-1])
 
Diese Funktion ruft die einzelnen Zahlen auf (mit $zahl[$i]). In der Schleife wird einfach hochgezählt von der ersten Zahl ($zahl[0]) bis zum ende des Strings ($zahl[strlen($zahl)-1])

Zuerst soll ja aus allen bereits vorhandenen Zahlen die Quersumme gesucht werden. Steht diese fest, sollte weiterhin solange eine Quersumme errechnet werden bis eben die 44 nicht mehr überschritten wird...

...ich bekomme es einfach nicht hin. :(
 
Die oberen Lösungen sind alle Korrekt, aber ich kann ja auch noch eine Poste, noch net neue :D. Sieht aber relativ simpel dann aus:

PHP:
$zahl = "6453216216";
while($zahl >= 44) {
for($i = 0; $i < strlen($zahl); $i++) {
    $Quer += $zahl[$i];
}
$zahl = (string)$Quer;
}


Ist nicht getestet, vielleicht hab ich auch nen kleinen Gedankenfehler drin. Sollte aber vom Prinzip her stimmen.
 
Ist nicht getestet, vielleicht hab ich auch nen kleinen Gedankenfehler drin.
Ja, ist ein kleiner Fehler drin. Die Bedingung soll ja nur auf die Quersumme zutreffen, nicht auf die Zahl selbst. D.h. dein Algorithmus würde für alle Zahlen <= 44 nicht funktionieren.

Deshalb ist es sinnvoller eine fußgesteuerte Schleife zu verwenden als eine kopfgesteuerte, da zuerst mal eine Quersumme berechnet werden muss bevor die Bedinung geprüft werden kann.

@Claudia1986: Dein Code hat Fehler die der PHP Interpreter sicherlich bemängelt. Warum zeigst du dann nicht die Fehlermeldung (wenn ich dich schon danach frage)?

Die Funktion quersumme kannst du ja so lassen. Und wie man dann solange Quersummen zu berechnet, bis die Quersumme <= 44 ist, hab ich dir schon gezeigt.

Obwohl wir ja eigentlich bei tutorials.de sind, und nicht bei ichschreibdirdeinencode.de ;) hier mal im Zusammenhang:
PHP:
$zahl = "658955556228465156";
 
function quersumme($zahl)
{
  settype($zahl, "string");
  $res = 0;
  for($i=0; $i<strlen($zahl); $i++)
  {
    $res = $res + $zahl[$i];
  }
  return $res;
} 

do {
  $zahl = quersumme($zahl);
  echo "$zahl<br>";
} while ($zahl > 44);
Gruß
 
@deeptrhorat

aber wenn ich $zahl die Quersumme zuweise, direkt bevor die Bedingung geprüft wird, dann müsste es ja trotzdem funktionieren (ab ich gemacht)

Fußgesteuert muss sie trotzdem sein. Da hast auf jeden Fall recht.
 
Zurück