Wie errechne ich die Quersumme aus einer eingegbene Zahl ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
swaTch
User
Beiträge: 6
Registriert: Mittwoch 22. September 2004, 17:53

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 :)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
swaTch
User
Beiträge: 6
Registriert: Mittwoch 22. September 2004, 17:53

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Gast

Okay recht herzlichen Dank. Werde jetzt mal versuchen die einzelnen Befehle nachzuvollziehen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Es reichen sogar 2 :wink::

Code: Alles auswählen

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

Hi, könntest du vielleicht diese zwei Zeichen Code für Python Anfänger wie mich kommentieren?

Gruß
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
seli
User
Beiträge: 12
Registriert: Montag 4. Oktober 2004, 22:58
Kontaktdaten:

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 ;)
Zuletzt geändert von seli am Dienstag 5. Oktober 2004, 13:10, insgesamt 1-mal geändert.
[size=75]:wq[/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
Zuletzt geändert von Leonidas am Dienstag 5. Oktober 2004, 13:25, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
seli
User
Beiträge: 12
Registriert: Montag 4. Oktober 2004, 22:58
Kontaktdaten:

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...
[size=75]:wq[/size]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

List Comprehensions habe ich erst nach dem Lesen eines Dokuments von einem gewissen Olli verstanden, aber einsetzen tue ich es kaum.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
seli
User
Beiträge: 12
Registriert: Montag 4. Oktober 2004, 22:58
Kontaktdaten:

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:
[size=75]:wq[/size]
DerFragensteller

hallo, ich habe dieselbe frage nur brauch ich eine rekursive lösung. kann mir da vielleicht einer weiterhelfen? vielen dank schonmal im voraus.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Antworten