"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Ziffernsumme rein mathematisch als Summe

COLOSSUS 22.10.2004 - 14:41 3267 15
Posts

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12071
Ich stehe vor einem eigentlich recht trivialen Problem, aber will wohl einfach die Lösung dafür einfach nicht sehen...

Im Grunde geht es mir darum, von einer ganzen Dezimalzahl beliebiger Länge die Ziffernsumme mit rein mathematischen Mitteln, also ohne Substringadressierung, zu berechnen. Mein Ansatz für eine z. B. 4-stellige Zahl der Form abcd ist im Moment wie folgt...


Um die jeweils letzte Stelle einer Zahl dieser Form zu berechnen, überprüfe ich einfach, in welche Restklasse modulo 10 die Zahl fällt, ergo:

x = abcd(mod 10)

Um jetzt die letzte Stelle von abcd "abzustreifen", subtrahiere ich x von abcd, was (weil abcd ja auch als z. B. e*10^3+f*10^2+g*10^1+x*10^0 dargestellt werden könnte) abc0 ergibt (0 ist dabei "wörtlich" zu nehmen, nicht als Faktor einer Multiplikation ;>;). Dieses Zwischenergebnis durch 10 dividiert ergibt abc, oder aber e*10^2+f*10^1+g*10^0 - und alles was zu tun ist, ist, diese Zahl wieder in meine "Funktion" einzusetzen.

Nur scheitere ich im Moment einfach an der Überführung des Problems von deutscher in mathematische Semantik, sprich: Ich weiß nicht, wie ich den Schmorrn als Summe anschreiben soll...

Wäre dankbar, wenn mir wer den entscheidenden Wink geben könnte... ach, übrigens:
auslachen verboten :p ;)

Tia,
- colo

AoD

aka AngelOfDeath
Avatar
Registered: Nov 2002
Location: St. Pölten
Posts: 1482
Mit einer Rekursion sollte das kein Problem sein (sag ich mal so :p ).
Du musst es nur schaffen, den wiederkehrenden Teil mathematisch aufzuschreiben (Mod 10; Rest abziehn; Division durch 10), der Rest kommt dann von selbst.

HaBa

Legend
Dr. Funkenstein
Avatar
Registered: Mar 2001
Location: St. Speidl / Gle..
Posts: 19731
x / 1000
x / 100
x / 10

Und jeweils mit dem Rest füttern und addieren ...

1234
1, 234 Rest
2, 34 Rest
3, 4 Rest

...

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
floor(4001/1000) -> 4
floor(4001/100) -> 40-10*4-> 0
floor(4001/10) -> 400-10*40-> 0
floor(4001/1) -> 4001-10*400-> 1
4+0+0+1

formelmässig:
siehe http://www.overclockers.at/showthre...277#post1665277 - die formel von hier hatte keinen wirklichen wert, durch mehrmaliges verschreiben :D

edit: partially owned by haba :D aber ich hab nur länger braucht weil ichs auch beschrieben hab :p
Bearbeitet von watchout am 22.10.2004, 15:46 (darn, verschrieben...)

HaBa

Legend
Dr. Funkenstein
Avatar
Registered: Mar 2001
Location: St. Speidl / Gle..
Posts: 19731
Funktioniert IMHO nicht => kann ja immer noch eine stelle größer sein, und Abfrageschleifen würden endlos laufen ...

=> Maximalanzahl einführen und dann von LS nach MS auf "0" bei Division überprüfen, wenn gefunden jeweils Iteration in "s" speichern ...

HeuJi

OC Addicted
Avatar
Registered: Jul 2001
Location: Vienna
Posts: 7379
Hmm, muss das für n-Stellen gelten?
Wenn du mehr als 4 Stellen hast dann funktioniert das wieder nicht.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von HaBa
Funktioniert IMHO nicht => kann ja immer noch eine stelle größer sein, und Abfrageschleifen würden endlos laufen ...

=> Maximalanzahl einführen und dann von LS nach MS auf "0" bei Division überprüfen, wenn gefunden jeweils Iteration in "s" speichern ...
stimmt, hab mich nochmal verschrieben... darn :rolleyes:

n=anzahl d. stellen
i=aktuelle stelle
x=zahl

f1(x,i|ieN,n)=floor(x/10^(n-i); #zwischenstufe, um redundanz zu verringern ;)
f2(x,i,n)=f1(x,i,n)-10*f1(x,i-1,n);

sum(f2(x,i,n),i=0,i<=n)

so, hab mehr gebräuchliche varbiablennamen verwendet... und meine zig schreibfehler ausgebessert :D
das einzige was man beachten muss, is' dass i in f1 nie kleiner als 0 sein darf, dh. das muss programmiertechnisch abgefangen werden... (habe das mit ieN (i element d. nat. zahlen) versucht zu verdeutlichen...)

wie n zu berechnen is weiss ich aber no immer net :D

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
n=unendlich ist nie falsch :)

Sonst halt irgendwas mit log10

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
n(x)=floor(log(x))+1 #log = zur basis 10...

so, n(x) sollte theoretisch funktionieren... und auch oben einsetzbar sein...

ok, mit rest isses vielleicht einfacher... hab mir folgendes überlegt
f(x|x>0,xeN)=f(x%(10^n(x)))

programmtechnisch musst selber umsetzen :p

@ringding... keine ahnung was deine aussage zu bedeuten hat, aber wenn n=1 wahr ist, so ist die frage n==inf. FALSCH - somit stimmt sie nichtmal...

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
Ich habe mit n die Anzahl der Schleifendurchläufe gemeint. Das kannst du auch beliebig oft wiederholen, es werden halt lauter 0 rauskommen.

smashIt

master of disaster
Avatar
Registered: Feb 2004
Location: OÖ
Posts: 5217
ähm leute, hab ich mir bei colossus seiner beschreibung das hirn verrenkt oder wollt ihr die quersumme einer integer-zahl berechnen?

probierts mal damit:

Code:
int z=0815-4711; //deine zahl
int q=0; //wird dann die quersumme
while(z!=0){
 q+= z%10;
 z/=10;
}

AoD

aka AngelOfDeath
Avatar
Registered: Nov 2002
Location: St. Pölten
Posts: 1482
du hast ganz recht, nur es ging darin deinen c/java/etc. code mit hilfe der mathematik darzustellen. ;)

smashIt

master of disaster
Avatar
Registered: Feb 2004
Location: OÖ
Posts: 5217
der mathematische ausdruck is nunmal quersumme.
fragt mich aber nicht obs dafür auch ein symbol gibt.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von smashIt
der mathematische ausdruck is nunmal quersumme.
fragt mich aber nicht obs dafür auch ein symbol gibt.
noch nie was von grundlagenmathematik gehört? :o

ausserdem: hast du den code getestet? ich glaub nämlich net dass er funkt...

smashIt

master of disaster
Avatar
Registered: Feb 2004
Location: OÖ
Posts: 5217
hab mal bischen auf wikipedia gesucht und eigentlich nur rausgefunden das man modulo auch in der mathematik als MOD schreibt.

dann sollte das ganze mathematisch so aussehn:

modulo.png

is allerdings ohne garantie auf richtigkeit.


@watchout:
hier das komplette prog:
Code:
class Quersumme{
 public static void main(String[] arg){
  Out.print("bitte ganze zahl eingeben: ");
  int z=In.readInt();
  int q=0;
  while(z!=0){
   q+=z%10;
   z/=10;
  }
  Out.println("die quersumme betr„gt: "+ q);
 }
}
verwendet i/o-classen die nicht ganz so umständlich sind wie die java-eigenen.

-----------EDIT--------------
das unendlich über der summe sollt man glaub ich durch ld(n) ersetzen können (dekadischer logarithmus von n)
Bearbeitet von smashIt am 22.10.2004, 22:46
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz