Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249192 (10628)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Wie bildet man eine Quersumme
Philip Sternberg
| 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
Carlo Keil
| 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
Philipp Sternberg
| 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
Jürgen K.
| 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
Sebastian Sprenger
| 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
Jörg Sellmeyer
| 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

| Zurück zur Übersicht