Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249192 (10628)
  Suchen
 Zurück zur Übersicht
 AutorThema: Wie bildet man eine Quersumme
Philip Sternberg
Datum:10.02.02 21:01 Antwortenals Email verschicken (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


Carlo Keil
Datum:10.02.02 21:46 Antwortenals Email verschicken (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


Philipp Sternberg
Datum:11.02.02 11:04 Antwortenals Email verschicken (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


Jürgen K.
Datum:11.02.02 07:50 Antwortenals Email verschicken  


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


Sebastian Sprenger
Datum:11.02.02 10:46 Antwortenals Email verschicken (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


Jörg Sellmeyer
Datum: 11.02.02 12:54 Antwortenals Email verschicken (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


 Zurück zur Übersicht