COLOSSUS
AdministratorGNUltra
|
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 Tia, - colo
|
AoD
aka AngelOfDeath
|
Mit einer Rekursion sollte das kein Problem sein (sag ich mal so ). Du musst es nur schaffen, den wiederkehrenden Teil mathematisch aufzuschreiben (Mod 10; Rest abziehn; Division durch 10), der Rest kommt dann von selbst.
|
HaBa
LegendDr. Funkenstein
|
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
Legendundead
|
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 edit: partially owned by haba aber ich hab nur länger braucht weil ichs auch beschrieben hab
Bearbeitet von watchout am 22.10.2004, 15:46 (darn, verschrieben...)
|
HaBa
LegendDr. Funkenstein
|
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
|
Hmm, muss das für n-Stellen gelten? Wenn du mehr als 4 Stellen hast dann funktioniert das wieder nicht.
|
watchout
Legendundead
|
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 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 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
|
Ringding
Pilot
|
n=unendlich ist nie falsch Sonst halt irgendwas mit log10
|
watchout
Legendundead
|
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 @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
|
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
|
ähm leute, hab ich mir bei colossus seiner beschreibung das hirn verrenkt oder wollt ihr die quersumme einer integer-zahl berechnen? probierts mal damit: int z=0815-4711; //deine zahl
int q=0; //wird dann die quersumme
while(z!=0){
q+= z%10;
z/=10;
}
|
AoD
aka AngelOfDeath
|
du hast ganz recht, nur es ging darin deinen c/java/etc. code mit hilfe der mathematik darzustellen.
|
smashIt
master of disaster
|
der mathematische ausdruck is nunmal quersumme. fragt mich aber nicht obs dafür auch ein symbol gibt.
|
watchout
Legendundead
|
der mathematische ausdruck is nunmal quersumme. fragt mich aber nicht obs dafür auch ein symbol gibt. noch nie was von grundlagenmathematik gehört? ausserdem: hast du den code getestet? ich glaub nämlich net dass er funkt...
|
smashIt
master of disaster
|
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: is allerdings ohne garantie auf richtigkeit. @watchout: hier das komplette prog: 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
|