Seite 1 von 1
Ziffernsumme
Verfasst: Dienstag 4. April 2006, 11:55
von tgooper
Hallo!
Gibt es in Python eine Methode oder einen einfachen Lösungsansatz für folgendes Problem:
Eingabewert ist eine 8stellige Zahl
Ausgabe soll die Ziffernsumme aller geraden bzw. ungerade Ziffernstellen sein.
z.B.: 12345678
Ergebnis1 = 1+3+5+7 = 16
Ergebnis2 = 2+4+6+8 = 20
Thankx
Verfasst: Dienstag 4. April 2006, 12:01
von modelnine
Code: Alles auswählen
num = 931233
ungerade = reduce(lambda a, b: a+int(b),str(num)[::-2],0)
gerade = reduce(lambda a, b: a+int(b),str(num)[-2::-2],0)
print "Gerade Ziffern:", gerade
print "Ungerade Ziffern:", ungerade
sollte tun was Du haben willst, wenn man gerade/ungerade Ziffern von der letzten beginnend zählt, wobei die letzte Ziffer eine ungerade ist (sprich, der obige Code kann auch mit ungradzahliger Anzahl von Ziffern umgehen).
Verfasst: Dienstag 4. April 2006, 12:13
von tgooper
Besten Dank für die rasche Antwort.

Verfasst: Mittwoch 5. April 2006, 17:27
von Bernhard
Das ist total unfair. Da hat man sich als Anfänger so weit in Python eingeguckt, dass man solche Probleme in irgendwas zwischen einer Halben und zwei Seiten Python lösen könnte, und dann kommt hier im Forum irgendein Guru und zaubert das ganze locker in zwei durchdachten Zeilen hin. Ihr seid gemein...
Gruß,
Bernhard
Verfasst: Mittwoch 5. April 2006, 18:59
von mawe
Hi!
Also um ehrlich zu sein versteh ich die Lösung von modeline nicht (sie scheint auch nicht zu funktionieren,oder?). Ich würds so machen:
Code: Alles auswählen
gerade = sum([int(i) for i in str(num) if not int(i)%2])
ungerade = sum([int(i) for i in str(num) if int(i)%2])
EDIT: Ich nehm alles zurück ... "Ziffernstellen" ... tja, lesen sollte man können
EDIT2:
Code: Alles auswählen
sum([int(i) for i in str(num)[::2]])
sum([int(i) for i in str(num)[1::2]])
Gruß, mawe
Verfasst: Mittwoch 5. April 2006, 19:02
von modelnine
Klar funktioniert sie.
Code: Alles auswählen
modelnine@phoenix ~ $ python
Python 2.4.2 (#1, Apr 3 2006, 12:10:45)
[GCC 3.4.6 (Gentoo 3.4.6, ssp-3.4.5-1.0, pie-8.7.9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> num = 931233
>>> ungerade = reduce(lambda a, b: a+int(b),str(num)[::-2],0)
>>> gerade = reduce(lambda a, b: a+int(b),str(num)[-2::-2],0)
>>> print "Gerade Ziffern:", gerade
Gerade Ziffern: 13
>>> print "Ungerade Ziffern:", ungerade
Ungerade Ziffern: 8
>>>
modelnine@phoenix ~ $
Verfasst: Mittwoch 5. April 2006, 20:11
von Drizzt
Auf die Gefahr hin, daß ich mich vertue, wollte er nicht die Summe von je Gerade oder Ungeraden ?
num = 931233
wäre das nicht einmal:
gerade = 2
ungerade = 9+3+1+3+3
gerade = 2
ungerade = 19 ?
Kann auch sein, daß ich mich nun ganz vertue, und in python bekomm ich es weder elegant noch schnell hin

nur rein logisch habe ich entweder das Problem verkant, oder die Lösung nicht verstanden.
mfg
Alex
Verfasst: Mittwoch 5. April 2006, 20:33
von modelnine
Wenn Du Dir das Problem ansiehst, dann will er die Summe der geraden Ziffernstellen und der ungeraden Ziffernstellen.
Sprich:
654321 (sind die Ziffernstellen)
991234
Summe gerader Ziffernstellen = 3+1+9
Summe ungerader Ziffernstellen = 4+2+9
... Und genau das macht der Code den ich produziert hab.
Verfasst: Mittwoch 5. April 2006, 20:42
von Drizzt
Dann Sorry, hab mich dann wohl doch verlesen

Ziffernstellen != Ziffern
mfg
Alex
Verfasst: Donnerstag 6. April 2006, 06:33
von jens
modelnine hat geschrieben:Code: Alles auswählen
reduce(lambda a, b: a+int(b),str(num)[::-2],0)
reduce(lambda a, b: a+int(b),str(num)[-2::-2],0)
mawe hat geschrieben:Code: Alles auswählen
sum([int(i) for i in str(num)[::2]])
sum([int(i) for i in str(num)[1::2]])
Also ich würde mawe's Lösung vorziehen... Die kann ich persönlich viel besser verstehen... Aber ich mag auch kein lambda und Co.

Verfasst: Donnerstag 6. April 2006, 07:22
von modelnine
Wenn man in mawe's Lösung noch das ::2 und 1::2 durch ::-2 und -2::-2 ersetzt, dann ist sie auch (ganz=komplett=vollständig) in Ordnung, IMHO.
Das Problem stellt sich zwar bei den gegebenen Zahlen nicht (da feste Breite), aber wie nummeriert man? Was ist gerade? Ist die erste Stelle immer eine gerade/ungerade Ziffernstelle? Oder eben die letzte?
Ich persönlich finds wenig sinnvoll von vorne zu zählen, da die Zahlen in diese Richtung wachsen, also zählt man von hinten, und da hab ich per Definition einfach gesagt dass die letzte Ziffer immer eine ungerade ist. Deswegen die -2 und -2::-2, die im Endeffekt nichts anderes bedeuten als dass die Zählrichtung des Splicings umgekehrt ist, und man damit immer einen Fixpunkt hat, egal wie lang (wieviele Stellen) die Zahl hat.
Bei mawe's Lösung ist immer die erste Ziffernstelle eines bestimmten Typs, dadurch hat man seltsame Effekte wenn man eine Dezimal-Stelle hinzutut und sich auf einmal beide Summen ändern, nicht nur eine.