Ansatz

Ostkreuz

Aktives Mitglied
Schreiben Sie eine Methode berechneQuersumme2, die für einen ganzzahligen Eingabewert die erweiterte Quersumme berechnet. Die erweiterte Quersumme ist definiert als die Summe aller einzelnen Ziffern. Ist das Ergebnis >9, d.h. besitzt es mehre Stellen, wird wiederum die Summe aller Ziffern berechnet. Dieses Vorgehen wird wiederholt bis das Ergebnis <=9 ist. Entwickeln Sie Ihre Methode gemäß des gegebenen Dokumentationskommentars.

Für die Quersumme habe ich bereits eine Methode, aber mir fällt nicht ein wie ich hier nun weiter am Code schreiben soll. Es ist ja eigentlich klar das die Methode zur Quersumme solange durchlaufen werden soll, bis die Quersumme kleiner 9 ist. Mir fällt aber einfach kein Ansatz ein.
public class Quer{

Code für Quersumme:
/**
* Berechnet die erweiterte Quersumme der Eingabezahl (long)
*
* @param input Die Zahl, deren Quersumme berechnet werden soll
* @Return die erweiterte Quersumme
*/
public static int berechneQuersumme(int zahl) {
int summe = 0;
while (0 != zahl) {
// addiere die letzte ziffer der uebergebenen zahl zur summe
summe = summe + (zahl % 10);
// entferne die letzte ziffer der uebergebenen zahl
zahl = zahl / 10;
}
return summe;
}
}
}
 
Beste Antwort
Wenn es doch eine Methode zur Berechnung der Quersumme gibt:
Java:
static int extendedDigitSum(long number) {
    long result = number;
    while (result >= 10) {
        result = quersumme(result);
    }
    return result;
}

Direktes Verständnis der Aufgabe, die man in Worte einfach beschreiben kann:
So lange das Ergebnis größer gleich 10 ist berechnest Du die Quersumme.

Eigentlich wäre das eine do while Schleife, aber mathematisch muss man keien Quersumme berechnen, wenn man nur eine Stelle hat.

White_Fox

Top Contributor
Vielleicht wäre es einfacher, die Zahl nicht als int zu behandeln, sondern vorher in einen String zu konvertieren. Den String kannst du dann in Ruhe Zeichen für Zeichen abfrühstücken.

Edit: Die Zusatzaufgabe "Erweiterte Quersumme" schreit förmlich nach Rekursion.
 

MarvinsDepression

Bekanntes Mitglied
Wenn Du die Quersumme berechnet hast und diese >9 ist, kannst Du dann die Quersumme von diesem Wert berechnen?

P.S.: Es muss ja nicht der ganze Code in einer einzigen Methode stehen. So kann int berechneQuersumme(...) von int berechneErweiterteQuersumme(...) wiederholt aufgerufen werden.
 
Zuletzt bearbeitet:

MarvinsDepression

Bekanntes Mitglied
na ja, weil Rekursion am Anfang doch etwas verwirrend ist. Außerdem schadet es nicht, sich möglichst früh anzugewöhnen, Code aufzuteilen.

edit: berechneErweiterteQuersumme enhält auch keinen doppelten Code, so wie ich mir das vorstelle.
 

White_Fox

Top Contributor
na ja, weil Rekursion am Anfang doch etwas verwirrend ist
Ach scheiß was drauf...ich hab heute gute Laune, ich freue mich über das saukalte Wetter, und in Java habe ich sowieso viel zu selten etwas programmiert in diesem Jahr, ich glaube ich habe das ganze Jahr noch keine 30 Codezeilen geschrieben.

Bitte schön:
Lieber TS, ich hoffe du hast es auch alleine hinbekommen. Wir können sowas, du sollst es auch können. Überleg dir, ob du spicken oder nur vergleichen willst:
Java:
package digitsum;

import java.util.Scanner;

public class DigitSum {
    
    private static int getExtendedDigitsum(int input) {
        String intString = String.valueOf(input);
        int digitSum = 0;
        
        for(char c : intString.toCharArray()){
            digitSum += Integer.valueOf(Character.toString(c));
        }
        
        return digitSum > 9 ? getExtendedDigitsum(digitSum) : digitSum;
    }

    public static void main(String[] args) {
        int input;
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("Bitte Zahl eingeben:");
        input = scanner.nextInt();
        
        System.out.println("Die erweiterte Quersumme von " + input + " lautet: " + getExtendedDigitsum(input));
    }
}


PS:
Wenn es doch eine fertige Methode gibt, dann ist es doch auch relativ einfach, diese zu verwenden. Das ist doch gerade der Ansatz: Kein doppelter Code.
Ok, wenn es Teil der Aufgabe ist so eine Methode zu verwenden, dann ist das natürlich richtig. Die einfache Quersumme habe ich jetzt nicht berücksichtigt, dann muß der TS halt doch nochmal ran.
 

MarvinsDepression

Bekanntes Mitglied
Java:
static int extendedDigitSum(long number) {
    if (number < 10) return (int) number;
    int sum = (int) (number % 10) + extendedDigitSum(number / 10);
    return (sum < 10) ? sum : extendedDigitSum(sum);
}
😁
 

KonradN

Super-Moderator
Mitarbeiter
Wenn es doch eine Methode zur Berechnung der Quersumme gibt:
Java:
static int extendedDigitSum(long number) {
    long result = number;
    while (result >= 10) {
        result = quersumme(result);
    }
    return result;
}

Direktes Verständnis der Aufgabe, die man in Worte einfach beschreiben kann:
So lange das Ergebnis größer gleich 10 ist berechnest Du die Quersumme.

Eigentlich wäre das eine do while Schleife, aber mathematisch muss man keien Quersumme berechnen, wenn man nur eine Stelle hat.
 
Beste Antwort

Ostkreuz

Aktives Mitglied
Hallo danke erstmal für die ganze Hilfe, eigentlich sollte mein Code jetzt stimmen, da beim Test auch die richtigen Ergebnisse herrauskommen, aber es werden mir immer noch Fehlermeldungen gemacht, falls ich abgeben möchte.
Code:
public class Hello {
public static void main(String[] arg) {
System.out.println (quersumme(5345));
}

/**
* Berechnet die erweiterte Quersumme der Eingabezahl (long)
*
* @param input Die Zahl, deren Quersumme berechnet werden soll
* @Return die erweiterte Quersumme
*/
public static long quersumme(long zahl) {
long summe = 0;
while (0 != zahl) {
// addiere die letzte ziffer der uebergebenen zahl zur summe
summe = summe + (zahl % 10);
// entferne die letzte ziffer der uebergebenen zahl
zahl = zahl / 10;
}
return summe;
}
static long berechneQuersumme(long number) {
long result = number;
while (result > 10) {
result = quersumme(result);
}
return result;
}

Fehlermeldungen:
MyTest.java:19: error: cannot find symbol
assertEquals(5,f.berechneQuersumme2(77));
^
symbol: method berechneQuersumme2(int)
location: variable f of type Quer
MyTest.java:20: error: cannot find symbol
assertEquals(8,f.berechneQuersumme2(53));
^
symbol: method berechneQuersumme2(int)
location: variable f of type Quer
MyTest.java:21: error: cannot find symbol
assertEquals(8,f.berechneQuersumme2(17855));
^
symbol: method berechneQuersumme2(int)
location: variable f of type Quer
MyTest.java:22: error: cannot find symbol
assertEquals(7,f.berechneQuersumme2(88888888888L));
^
symbol: method berechneQuersumme2(long)
location: variable f of type Quer 4 errors
Not compiled
 

MarvinsDepression

Bekanntes Mitglied
while (result > 10) {
Schau noch mal genau hin. Was stimmt hier noch nicht (es ist nur ein Zeichen)

P.S.: Für den Rückgabetyp der Methoden dürfte int reichen, da selbst die einfache Quersumme für sehr große Zahlen kaum die Tausendergrenze überschreiten wird. Du müsstest nur den Methodenkopf abändern zu int querSumme(...) und int berecheQuersumme(...) sowie in den return-Zeilen ein (int) einfügen (-> return (int) summe; -> return (int) result; ) um die Werte vom Typ long zum kleineren Typ int zu casten.
Der typ long für die Parameter bleibt natürlich.
 

Ähnliche Java Themen


Oben