Hallo !
Ich habe folgende Aufgabe: Ich soll von einer beliebigen Zahl die einzelnen Ziffern jeweils quadrieren, danach addieren und anschliessend den Vorgang bei dem Ergebnis solange wiederholen bis entweder 1 oder 4 als Endergebnis rauskommt.
Kann mir irgendwer ne kleine Starthilfe geben ?
Mein Ansatz bis jetzt ist: ich wandle die Zahl mal in nen String um und komme dann mit irgendner methode dann mal auf die Anzahl der Stellen. Dann müsste ich quasi jede dieser Stellen wieder in Zahlen umwandeln und die Rechnschritte ausführen. Am Ende wird nur überprüft ob das ergebnis 1 oder 4 ist. Aber die Umsetzung ist mir noch vollkommen suspekt..... Das ganze soll innerhalb einer Klasse gelöst werden.
Anderer Ansatz wäre die letzte Ziffer mit dem Modulo-Operator zu holen (97 % 10), das Quadrat zu berechnen, aufsummieren und dann die letzte Ziffer mit Division durch 10 abzuschneiden.
Das machst du solange wie die Zahl > 0 ist.
Den Vorgang kannst du ja dann mit der neu errechneten Zahl wiederholen.
Naja ich frage mich wie ich das dann de facto umsetze dass automatisch mit den einzelnen Ziffern gerechnet wird. Sind ja nicht in Variable deklariert oder so.... wie soll ich dann Rechenschritte ausführen damit. Und dadurch dass die Zahlen immer unterschiedlich viele Ziffern haben ist die Rechnung quasi auch immer unterschiedlich....
Bei Robat's Vorschlag kriegst du mit diesem Codeschnipsel nacheinander alle Ziffern (von hinten her)
Code:
int zahl = 12345;
int ziffer = zahl;
while (zahl > 9) {
ziffer = zahl%10; // das ergibt die letzte Ziffer
// jetzt kannst du mit ziffer was rechnen
zahl=zahl/10; // das schneidet die letzte Ziffer ab
}
Hm damit kann ich mir zwar die letzte Zahl ausgeben lassen... allerdings wird ja nach jeder Schleife die zahl quasi um ne Stelle kleiner und int ziffer neu deklariert. Die ziffer vom vorigen Durchlauf wird nirgendwo gespeichert... ich muss ja sämtliche Stellen auch speichern ! in eigenen variablen um damit dann den gesamten Rechenschritt durchführen zu können. In dem Beispel kann ich zwar immer die letzte Ziffer quasi " rausschneiden " aber wie soll ich alle speichern und dann am Ende noch ne Rechnung damit machen. Das Ergebnis dann speichern und wiederholen....
Ich müsste quasi jede Ziffer bei dem Durchlauf immer automatisch in einer automatisch erstellten Variable speichern. ( Dazu muss das Programm automatisch den Variablen datatypen+namen zuweisen ?!? ) dann je, nachdem wieviele Variablen durch das neue Ergebnis erzeugt werden, additionen mit ebendiesen durchführen und dann nachdem das Ergebnis da ist beim nächsten Durchlauf jede Variable wieder neu einstellen.... irgendwie bin ich ziemlich verwirrt ^^
Ne Frage am Rande.... gibt es nicht irgendeine long ider int methode mit der ich bestimmte ziffern im index eines tokens abrufen kann ? Oder mit grundsätzliche anzeigen lassen kann wieviele Stellen die Zahl hat ?
Eigentlich nicht. Du benötigst doch nur eine Variable für die Eingabe und eine weitere, in der du die Quadrate summierst. Wenn du alle Ziffern verarbeitet hast, kannst du das ganze mit dem Wert der Summenvariablen als neue Eingabe noch einmal machen.
gibt es nicht irgendeine long ider int methode mit der ich bestimmte ziffern im index eines tokens abrufen kann ? Oder mit grundsätzliche anzeigen lassen kann wieviele Stellen die Zahl hat ?
Dafür könntest du dir eigene Methoden schreiben, die das entweder in einer Schleife ermitteln oder ausrechnen. Eine dreistellige Zahl liegt beispielsweise zwischen 10^2 und 10^3, eine vierstellige zwischen 10^3 und 10^4. Auf die nötigen Formeln kann man dann relativ einfach kommen. Für diese Aufgabe braucht man das allerdings nicht (wäre aber vielleicht eine gute Übung).
public static int quadratQuersumme(int zahl) {
int quadratQuersumme = zahl;
while (quadratQuersumme != 1 && quadratQuersumme != 4) {
int ziffer = quadratQuersumme;
int neueZahl = quadratQuersumme;
int summe = 0;
while (neueZahl > 0) {
ziffer = neueZahl%10; // das ergibt die letzte Ziffer
summe = summe + (ziffer*ziffer);
neueZahl=neueZahl/10; // das schneidet die letzte Ziffer ab
}
quadratQuersumme = summe;
}
return quadratQuersumme;
}
OK also ich bin jetzt schon nahe dran, aber die letzte Erkenntnis treibt mich nahezu in den Wahnsinn.
Ich habe das jetzt so geschrieben:
Code:
public class Spielwiese {
public static void main(String[] args) {
long Quotient = 0L;
long Summe = 0L;
long Ausgangszahl = 58L;
long Ziffernstelle = Ausgangszahl;
while (Ausgangszahl > 0 ) {
Ziffernstelle = Ausgangszahl % 10; // das ergibt die letzte Ziffer
Quotient = Ziffernstelle * Ziffernstelle;
Summe += Quotient;
Ausgangszahl = Ausgangszahl / 10; // das schneidet die letzte Ziffer ab
if (Ausgangszahl == 0) {
Ausgangszahl = Summe;
Summe = 0L;
}
}
}
}
Die Rechnung funktioniert jetzt..... Allerdings bin ich offensichltich zu dumm um eine Bedingung zu finden bei der er aus der Schleife am Ende der Rechnung und NUR am Ende der Rechnung aussteigt.(Ist ja ansonsten ne Endlosschleife) Ich kann nicht als Bedingung setzen " wenn Summe 1 oder 4 ist dann steig aus " da bei manchen Zahlen wo er eigentlich weiterrechnen sollte ( überall quasi wo der Quotient der ersten Ziffer die er durchrechnet eben 1 oder 4 ist wie zB 111 oder 112) dann abbricht..... hab schon nen Knoten im Kopf. :/
Stimmt ja.... Ich dachte, hier wurde aufgeräumt. Ja in dem Thread iterierte Quersumme ist ja auch mehr oder weniger eine Diskussion entstanden mit Rekursion Optimierung. Und ich störe hier nicht weiter.