# Jede Ziffer einer Zahl auslesen, damit rechnen und beim Ergebnis wiederholen ?



## Soltan (6. Nov 2017)

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.

Beispiel: 97 -> 9^2 + 72 = 130 -> 1^2 + 3^2 + 0^2 = 10 -> 1^2 + 0^2 = 1

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.


----------



## JStein52 (6. Nov 2017)

Dein Ansatz klingt doch gut. Ich würde sagen genau so machst du es mal. Was weisst du denn dabei nicht ?


----------



## Robat (6. Nov 2017)

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.


----------



## Soltan (6. Nov 2017)

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....


----------



## JStein52 (6. Nov 2017)

Bei Robat's Vorschlag kriegst du mit diesem Codeschnipsel nacheinander alle Ziffern (von hinten her)

```
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
}
```


----------



## Robat (6. Nov 2017)

JStein52 hat gesagt.:


> while (zahl > 9)


Die letzte Ziffer wollen wir doch nicht vernachlässigen 
`while(zahl > 0)`


----------



## Soltan (6. Nov 2017)

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....


----------



## Soltan (6. Nov 2017)

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 ^^


----------



## Soltan (6. Nov 2017)

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 ?


----------



## Meniskusschaden (6. Nov 2017)

Soltan hat gesagt.:


> Die ziffer vom vorigen Durchlauf wird nirgendwo gespeichert... ich muss ja sämtliche Stellen auch speichern


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.


Soltan hat gesagt.:


> 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).


----------



## JStein52 (6. Nov 2017)

Du könntest es ungefähr so machen:

```
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;
    }
```


----------



## Xyz1 (6. Nov 2017)

Soltan hat gesagt.:


> Beispiel: 97 -> 9^2 + 72 =


7 mal 7 ist nicht 72...

Fast sicher, das könnte es sein:
 

l(n) ist "die Länge" der Zahl n und d(i, n) naja selbstverständlich.


----------



## JStein52 (6. Nov 2017)

DerWissende hat gesagt.:


> 7 mal 7 ist nicht 72


sollte 7^2 heissen ... ein bisschen Phantasie mein junger Jedi


----------



## Soltan (6. Nov 2017)

OK also ich bin jetzt schon nahe dran, aber die letzte Erkenntnis treibt mich nahezu in den Wahnsinn.
Ich habe das jetzt so geschrieben:

```
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. :/


----------



## JStein52 (6. Nov 2017)

Du wirst eine zweite Schleife brauchen ...


----------



## Soltan (6. Nov 2017)

Ich bedanke mich vielmals.... habs hinbekommen. Stand irgendwie auf der Leitung. Danke


----------



## j2610 (10. Nov 2017)

Hallo Soltan, könntest du bitte deine Lösung noch hier rein posten, ich habe gerade das selbe Problem! Mfg


----------



## JStein52 (10. Nov 2017)

j2610 hat gesagt.:


> könntest du bitte deine Lösung noch hier rein posten


Guckst du Post #11, dort steht eine Lösung.


----------



## Xyz1 (10. Nov 2017)

JStein52 hat gesagt.:


> Guckst du Post #11, dort steht eine Lösung


Hatte ich nicht auch eine mit nur einer Zeile?


----------



## JStein52 (10. Nov 2017)

DerWissende hat gesagt.:


> Hatte ich nicht auch eine mit nur einer Zeile?


Das war ein anderer Thread mit iterierter Quersumme  Da lief der Wettbewerb "wer hat den kürzeren" ...


----------



## Xyz1 (10. Nov 2017)

JStein52 hat gesagt.:


> Das war ein anderer Thread mit iterierter Quersumme


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.


----------

