Autor | Thema: Wie bildet man eine Quersumme | | Datum:10.02.02 21:01 
(ps@burghardt-ib.de) | |
Hallo
kann mir jemand einen schnellen Weg sagen, wie ich aus einer Zahl eine Quersumme bilden kann
(bis jetzt habe ich mir mit Folgendem weiter geholfen:)
proc quersumme
parameters zahl1&
declare zahl1$,quersumme%
let zahl1$ = @str$(zahl1&)
whileloop @len(zahl1$)
let quersumme% = @add(quersumme%,@val(@mid$(zahl1$,&loop,1)))
wend
return quersumme%
endproc
Die Prozedur steht in einer schleife und ist leider nicht sehr schnell.
Gibt es einen scnelleren Weg um die Quersumme zuerhalten ??
(Vielleicht eine Funktion @checksum(zahl) für eine neue Profan Version???)
Philipp Sternberg
|
| | Datum:10.02.02 21:46 
(carlo.keil@web.de) | |
Hallo Philip,
die Quersumme einer Zahl ist gleich dem sogenannten Neunerrest. Das ist der Rest, der bei der Division durch 9 übrigbleibt. Die Modulo-Funktion ist da recht hilfreich.
Ich habe selbst noch nicht getestet, ob es schneller ist als deine Version, halte aber einen Test für erfolgversprechend.
Herzliche Grüsse
Carlo
|
| | Datum:11.02.02 11:04 
(ps@burghardt-ib.de) | |
Hallo Carlo
Das mit dem Neunerrest kann wohl kaum stimmen, schließlich gibt die @mod(zahl&,9) nur Werte zwischen 0 und 8 raus
(Klar Rest 9 oder größer geht nicht)!
Wenn ich als zahl& z.B. 27 eingäbe, wäre die Summe 9
@mod(27,9) wäre jedoch 0.
Trozdem ist die Idee das Problem im Bereich der "Uhren-Arithmetik" zu lösen gar nicht schlecht, ich werd mal sehen ob ich noch was darüber herausfinde
|
| | Datum:11.02.02 07:50 
| |
Hallo Philipp ... schau mal:
proc quersumme
parameters zahl1&
declare quersumme%
whileloop 1,@len(@str$(zahl1&))
quersumme% = quersumme% + @val(@mid$(@str$(zahl1&),&loop,1))
wend
return quersumme%
endproc
Mfg Jürgen
|
| | Datum:11.02.02 10:46 
(prof.chaos@netcologne.de) | |
Hi,
hier ist eine schnellere Methode:
proc Quersumme
parameters a&
declare a%
a%=0
whileloop 1,len(str$(a&))
add a%,mod(a&,10)
a&=div&(a&,10)
endwhile
return a%
endproc
Sebastian
|
| | Datum: 11.02.02 12:54 
(joerse@gmx.de) | |
Hallo,
Es kommt darauf an ob Du die "endgültige" Quersumme haben willst.
Die ist nämlich immer nur einstellig.
Und wenn Du die 0 als 9 interpretierst dürfte die 9er - Restmethode von Carlo
definitiv die schnellste sein.
Cls
declare lZahl&,sZahl$,iQuersumme%,Tick&
Decimals 0
Randomize
lZahl&=rnd(2000000000)
Case lZahl& < 0:lZahl&=lZahl& * -1
sZahl$=Input$("Bitte Zahl eingeben","Quersumme",Str$(lZahl&))
lZahl&=Val(sZahl$)
print lZahl&
print
Tick&=&gettickcount
WhileLoop Len(sZahl$)
iQuersumme%=val(Mid$(sZahl$,&Loop,1)) + iQuersumme%
print iQuersumme%,Mid$(sZahl$,&Loop,1)
Wend
print "Zeit benötigt: " + str$(&gettickcount - Tick&) + " Millisekunden"
print iQuersumme%
Tick&=&gettickcount
print if(Mod(lZahl&,9) = 0,"9",Mod(lZahl&,9))
print "Zeit benötigt: " + str$(&gettickcount - Tick&) + " Millisekunden"
WaitInput
|
|
|