Ziffernsumme

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.
Antworten
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

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
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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).
--- Heiko.
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Besten Dank für die rasche Antwort. :D
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

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

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
Zuletzt geändert von mawe am Mittwoch 5. April 2006, 19:07, insgesamt 1-mal geändert.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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 ~ $
--- Heiko.
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

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
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
--- Heiko.
Drizzt
User
Beiträge: 22
Registriert: Mittwoch 8. März 2006, 15:47

Dann Sorry, hab mich dann wohl doch verlesen ;)
Ziffernstellen != Ziffern

mfg
Alex
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
--- Heiko.
Antworten