Seite 1 von 2

Wie errechne ich die Quersumme aus einer eingegbene Zahl ?

Verfasst: Donnerstag 23. September 2004, 20:40
von swaTch
Hi,

ich würde gerne die Quersumme einer eingegebenen Zahl ermitteln lassen. Also z.B. 124. Da ist die Quersumme 7. Wenn möglich sogar für jede Zahlenlänge der Zahl. Ausserdem wäre es noch toll wenn man das Problem über modulo lösen könnte.

tHx schonmal im Vorraus :)

Verfasst: Donnerstag 23. September 2004, 20:51
von Dookie
Hi swaTch,

Code: Alles auswählen

Zahl = "123456789213476898654438476"
quersumme = sum([int(i) for i in Zahl])
oder wenns kein String ist:

Code: Alles auswählen

def Quersumme(zahl):
    result = 0
    while zahl:
        result += zahl % 10
        zahl = int(zahl / 10)
    return result

Gruß

Dookie

Verfasst: Donnerstag 23. September 2004, 21:15
von swaTch
Hi,

erstmal txh 4 Help aber wenn ich das in meinen Editor (Med) eingebe funktioniert das nicht. Weil ich ja kein Eingabe Feld habe ich muss dazu sagen das ich pYthon ersts eit ca. 1 Woche benutze.

Verfasst: Donnerstag 23. September 2004, 21:49
von Dookie
Hier mal ein ausführlich dokumentiertes Script

Code: Alles auswählen

#!/bin/env python

def Quersumme(zahl):
    result = 0
    while zahl: # solange Zahl nicht Null ist
        result += zahl % 10 # Zahl modulo 10 zum Ergebnis
        zahl = int(zahl / 10) # Zahl durch 10 Dividieren
    return result # Ergebnis zurueckgeben

while True: # Schleife
    eingabe = rawinput("Zahl eingeben: ")
    if not eingabe: # wenn nichts eingegeben wurde:
        break       #Schleife beenden
    intzahl = int(eingabe) # in Integer wandeln
    q = Quersumme(intzahl) # Quersumme berechnen
    print "Die Quersumme von %i  ist: %i" % (intzahl, q)
    print

Gruß

Dookie

Verfasst: Donnerstag 23. September 2004, 21:52
von Gast
Okay recht herzlichen Dank. Werde jetzt mal versuchen die einzelnen Befehle nachzuvollziehen.

Verfasst: Sonntag 3. Oktober 2004, 11:04
von Leonidas
Sowas würde doch auch gehen:

Code: Alles auswählen

Zahl = 123456789213476898654438476
Zahl = str(Zahl)
quersumme = sum([int(i) for i in Zahl])
Da reichen doch 3 Zeilen.

Verfasst: Sonntag 3. Oktober 2004, 15:06
von mawe
Hi!

Es reichen sogar 2 :wink::

Code: Alles auswählen

zahl = 1223223476476472364762346234764623462347623478236
quersumme = sum([int(i) for i in str(zahl)])
Gruß, mawe

Verfasst: Dienstag 5. Oktober 2004, 09:53
von Gast
Hi, könntest du vielleicht diese zwei Zeichen Code für Python Anfänger wie mich kommentieren?

Gruß

Verfasst: Dienstag 5. Oktober 2004, 11:16
von mawe
Hi!

Na ich versuch's mal in mehreren Schritten:
1)

Code: Alles auswählen

zahl = 123456789
Ok, das sollte noch klar sein :wink:
Jetzt wandeln wir die Zahl in einen String um, weil man über den iterieren kann:
2)

Code: Alles auswählen

zahl_als_string = str(zahl)    # -> "123456789"
Als nächstes wollen wir eine Liste mit den einzelnen Ziffern:
3)

Code: Alles auswählen

liste = [int(i) for i in zahl_als_string]    # -> [1,2,3,4,5,6,7,8,9]
Liest sich ganz leicht: Berechne die Integer-Werte für alle i die in zahl_als_string enthalten sind (und wirf sie in die liste) :wink:
Jetzt einfach noch die Summe berechnen:
4)

Code: Alles auswählen

quersumme = sum(liste)
Wenn wir 2),3) und 4) zusammenfassen, kommen die 2 Zeilen raus :D

Gruß, mawe

Verfasst: Dienstag 5. Oktober 2004, 12:11
von seli
Hm, klar, den Code so kurz wie möglich zu halten, spart Platz. Wie man aber sieht ist der Code so nicht leicht nachvollziehbar.
Ich schreibe leider auch oft solchen Code, aber seien wir mal ehrlich: 'sum([int(i) for i in str(zahl)])' ist unübersichtlich...
Achja, ich vergass: Freut euch über 'Error on line XX', denn dann darf man die Zeile auseinander nehmen ;)

Verfasst: Dienstag 5. Oktober 2004, 12:48
von Leonidas
Deswegen ahbe ich ja auch mit 3 Zeilen gearbeitet.
Und so viel Festplattenplatzverschwendung ist das nun auch nicht.
Code in Python sollte möglichst lesbar sein, nicht möglichst kurz (das auch, aber erst an zweiter stelle).

Verfasst: Dienstag 5. Oktober 2004, 12:49
von mawe
Hi!
seli hat geschrieben: 'sum([int(i) for i in str(zahl)])' ist inübersichtlich...
Da muß ich dir widersprechen!
Dookie hat ja auch eine ausfühliche Version geschrieben. Ich habe erst beim 3. Durchlesen verstanden wie das funktioniert (keine Kritik an dir, Dookie :wink:). Bei der Zeile die Du kritisierst sehe ich auf den ersten Blick, was passiert.
Die Geschmäcker sind natürlich verschieden, aber ich finde gerade List-Comprehension macht das Programmieren von solchen Problemstellungen sehr intuitiv und einfach. Mir ist schon klar, daß diese Syntax für einen Newbie einigermassen seltsam anmutet, aber wenn man so etwas selbst 2 oder 3 mal geschrieben hat, versteht man's.
Natürlich kann man es auch übertreiben (z.B. verschachtelte List-Comprehensions, ...) aber das ist ja in Python zum Glück nicht so einfach :wink:
Wie gesagt: Die Geschmäcker sind verschieden :D

Gruß, mawe

Verfasst: Dienstag 5. Oktober 2004, 13:09
von seli
Leonidas hat geschrieben:Deswegen ahbe ich ja auch mit 3 Zeilen gearbeitet.
Und so viel Festplattenplatzverschwendung ist das nun auch nicht.
Code in Python sollte möglichst lesbar sein, nicht möglichst kurz (das auch, aber erst an zeweiter stelle).
Ich meinte nicht Platz im Sinne von ein paar Bytes, sondern man spart Zeilen. Ein kurzes Script ist besser überblickbar.

mawe:
Ja, das Beispiel hier ist ja noch ziemlich ersichtlich. Aber oft passiert es halt, dass man möglichst viel auf eine einzige Zeile bringen möchte (Ein Beispiel aus java: System.out.println(new Foo().foo("foo").toString() oder so). Das wird dann aber sehr schnell unübersichtlich, und ich ich schon oben schrieb: Wenn irgendwann in so einer Zeile ein Fehler auftaucht, wünsch' ich viel Spass beim Suchen...

Verfasst: Dienstag 5. Oktober 2004, 13:22
von mawe
Hi!

Wie gesagt: Man kann alles übertreiben, und Dein Hinweis wegen dem Fehler ist natürlich ein starkes Argument es nicht zu tun :D

Gruß, mawe

Verfasst: Dienstag 5. Oktober 2004, 13:28
von Leonidas
List Comprehensions habe ich erst nach dem Lesen eines Dokuments von einem gewissen Olli verstanden, aber einsetzen tue ich es kaum.

Verfasst: Dienstag 5. Oktober 2004, 14:28
von Dookie
Hi,

im Ursprungsposting wurde eben nach einer Lösung mit Modulo gefragt, das wird bei der Lösung mit den Strings eben nicht benötigt, bzw. ist dann in der Umwandlung von int zu str versteckt. Darum meine Mehzeilige Lösung eben mit Modulo.
Ich verwende List Comprehensions inzwischen sehr oft, dafür kein map oder filter mehr. Schön wirds bei Python2.4 mit den Generatorexpressions, dann ists von Vorteil wenn man List Comprehensions versteht.


Gruß

Dookie

Verfasst: Dienstag 5. Oktober 2004, 14:43
von mawe
Hi!

Hoppla, daß swaTch etwas mit Modulo wollte hab ich ganz überlesen. Sorry Dookie, ich wollte Dein Snippet nicht schlechter machen als es eh schon ist :D (is nur Spaß!)

Gruß, mawe

Verfasst: Montag 18. Oktober 2004, 12:33
von seli
Apropos lange Zeilen.
Ich hab hier ein Dictionary. Ich wollte wissen, was drin ist. Ich seh dass dictionarry["service"] auch ein dict ist. ich schaue mir die keys an, dann die keys davon, und....
naja so siehts aus:

Code: Alles auswählen

print self.errorDict[self.errorDict.keys()[1]][self.errorDict[self.errorDict.keys()[1]].keys()[0]]
Kapiert man doch auf den ersten Blick, oder? :lol:

Verfasst: Sonntag 29. Mai 2005, 19:01
von DerFragensteller
hallo, ich habe dieselbe frage nur brauch ich eine rekursive lösung. kann mir da vielleicht einer weiterhelfen? vielen dank schonmal im voraus.

Verfasst: Sonntag 29. Mai 2005, 19:50
von CM

Code: Alles auswählen

def sumup(c,s=0):
	if type(c) == list:
		if len(c):
			s += c.pop(0)
			return sumup(c,s)
		else:
			return s
	else:
		c = [int(c) for c in str(c)]
		s += c.pop(0)
		return sumup(c,s)
		
if __name__ == '__main__':
	cifer = 2345262
	print sumup(cifer)
Ist aber ein bißchen umständlich ....
Wozu brauchst Du denn so etwas?

Gruß,
Christian