Quersumme in Java?

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

ich würde das so machen, wobei der Zusatz:

Wenn die Zahl eine negative Zahl ist, dann müsste man ja davon ausgehen, dass die Bestandteile der Zahl ebenso negativ sind, also dass eine -123 aus -100 + -20 + -3 besteht, weil ja erst 100-20-3 die -123 ergibt.
Beim Modulo ist das aber nicht so ersichtlich; daher die umständliche Variante. Man kann das sicherlich auch vereinfachen bzw. den Code dahingehend optimieren, aber so, dass das Ganze an sich erst mal ersichtlich ist, würde ich es ausführlich wie folgt gestalten:

int berechneQuersumme(final int uebergebeneZahl) {

//hier wird die Summe der Quersumme nacheinander aufgebaut
// und gespeichert
int summe = 0;

//übergebene Zahl wird für die Operationen zwischengespeichert
int zahl = uebergebeneZahl;

//wenn Zahl negativ ist
if(zahl < 0) {

//multipliziere mit -1, so dass sie positiv wird
zahl *= -1;
}

//solange Zahl nicht 0 ist
while(zahl != 0) {

//addiere die letzte Ziffer zur Summe der Zahl
summe = summe + (zahl%10);
//und teile die Zahl durch 10 (bei int wird dann "gekürzt",
//d. h. letzte Ziffer bzw. Nachkommastelle verschwindet
//und die vorderen Zahlen bleiben übrig
zahl = zahl/10;

}

//wenn die übergebene Zahl negativ ist
if(uebergebeneZahl < 0) {

//multipliziere die Summe mit -1, um sie negativ zu machen
summe *= -1;

}

return summe;

}

chilly10  13.01.2020, 10:39

optimieren könnte man das dahingehend, dass man in einer byte-Variable zwischenspeichert, ob die Zahl positiv oder negativ ist (mit 1 oder 0); wenn negativ, dann positiv macht und am Ende wieder negativ macht; man kann das auch in der while-Schleife einbauen, aber dann würde man mehrmals die Bedingung prüfen und das wäre dann auch unnötig, je nachdem wie lang die Zahl ist

0

Also wenn die eingeben Zahl von der die Quersumme berechnet werden soll nicht int seien muss würde ich die als String anlegen. Durch die Methode .length() kriegst du die Länge der Zahl heraus. Dann brauchst du eine Zählervariable die hochzählt und bei 0 beginnt. Die Schleife musst du so oft durchgehen wie die Länge der Zahl-1

also: while(zähler<=zahl.lenght()-1)

In der Schleife holst du dir dann den Wert an jeder Stelle des Strings

wert=Zahl.charAt(zähler)-48;

Die Variable Wert musst du davor natürlich deklarieren. Dann hast du noch ne Variable Ergebnis die den Anfangswert 0 hat. Da rechnest du dann immer den Wert an der momentanen Stelle drauf.

ergebnis=ergebnis+wert;

Am Ende der Schleife hat Ergebnis den Wert der Quersumme den kannst dann mit System.out.println() ausgeben lassen.

Der Tipp links bedeutet Modulo, was bedeutet, dass eine Zahl in Zehnerschritten gesehen wird, indem sie mit %10 gerechnet wird:

123 % 10 = 12 Rest 3, weil 3 nicht durch 10 teilbar

12 % 10 = 1 Rest 2, weil 2 nicht durch 10 teilbar

Der Modulo gibt immer den Rest, also die letzte Ziffer wieder.

So kannst Du nach und nach mittels Modulo mit Rest ungleich 0 die einzelnen Ziffern einer übergebenen Zahl durchgehen von hinten nach vorn.

Und diese kannst Du nach und nach miteinander addieren:

Summe = 0

Summe = Summe + Rest der aktuellen Modulo-Berechnung

Fraglich ist nur, was passiert, wenn es eine negative Zahl ist, die übergeben wird

Also -123 % 10

wird das dann bei der Quersumme in den Negativbereich gerechnet oder nur die letzten Ziffern addiert und die vorderste subrahiert vom Ergebnis?

Java ist nicht so meins. In JScript würde ich es so lösen:

// Quersumme rekursiv

var iZahl = 123;

function quersumme(iZahl)
{	
	if(iZahl >= 10)
		return (iZahl % 10) + quersumme(Math.floor(iZahl/10));
	return iZahl;
}

WScript.echo("Quersumme von " + iZahl + ": " + quersumme(iZahl));

Laut Tipp kannst du in Java auf Math.floor verzichten.

Woher ich das weiß:Berufserfahrung – Programmierer
Suboptimierer  13.01.2020, 11:02

Eine weitere, einfache Möglichkeit besteht darin, die Zahl in einen Text zu konvertieren und dann mit einer Textfunktion über die Stellen zu iterieren.

function quersumme2(iZahl)
{
	var i;
	var iQuer = 0;
	iZahl += "";
	for(i=0;i<iZahl.length;i++)
		iQuer += eval(iZahl.substr(i, 1));
	return iQuer;
}
0

Regex hat es schon gesagt.

Der Tipp ist sehr hilfreich. Probier es damit ggf ersteinmal händisch ohne Computer auf papier und setze es dann in Code um am Ende.

Denn das ist das was du hier denke ich eigentlich lernen sollst. Also die Aufgabe in einen Computer gerechten Algorithmus umsetzen. Der Rest ist dann bloß noch Kür.

Bikergirls Lösung funktioniert auch. Ist aber nicht unbedingt optimal.