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. :D

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. :wink:

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.