Quersummenberechnung



  • Signum schrieb:

    Bashar schrieb:

    Ach, du hast die Grundrechenarten noch nicht implementiert? Dann mach das erstmal, bevor du dir über die Quersumme Gedanken machst.

    ???

    Wieso verlangst du sonst von mir, dass ich dir eine Division durch 10 schreibe? Das sollte schon gehen!



  • Bashar schrieb:

    Signum schrieb:

    Bashar schrieb:

    Ach, du hast die Grundrechenarten noch nicht implementiert? Dann mach das erstmal, bevor du dir über die Quersumme Gedanken machst.

    ???

    Wieso verlangst du sonst von mir, dass ich dir eine Division durch 10 schreibe? Das sollte schon gehen!

    ...damit Du das Problem verstehst!
    Also, probier es mal, die Quersumme aus dem gepostetem Code zu errechnen, OHNE integrale datentypen (byte, short int, long int,...)!

    void test_09(void)
    {
    unsigned char magnitude[5] = {0x7F, 0x88, 0x32, 0x46, 0x78}; // Dezimal: 547745842808
    int size = sizeof(magnitude) / sizeof(magnitude[0]);
    int Your_Crossfoot = 0;
    int Correct_Crossfoot = 62; // 5+4+7+7+4+5+8+4+2+8+0+8
    unsigned char digit;
    
        // ...your code!    
        assert(Your_Crossfoot == Correct_Crossfoot);
    }
    


  • wxSkip schrieb:

    Mal ganz nebenbei: Du machst ne Bignum-Klasse und postest im ANSI-C-Forum? Oder meinst du ein Struct?

    ...weder noch, ich suche einen Algo (siehe erstes posting des Threads)



  • Signum schrieb:

    wxSkip schrieb:

    Mal ganz nebenbei: Du machst ne Bignum-Klasse und postest im ANSI-C-Forum? Oder meinst du ein Struct?

    ...weder noch, ich suche einen Algo (siehe erstes posting des Threads)

    Und der soll in C verfasst sein und C++-Klassen verwenden, oder stehe ich auf dem Schlauch? 😉



  • Heimelchen schrieb:

    Naja, hab jetzt nicht bis unendlich durchgetestet, aber bis 128 Bit funktioniert meine Lösung. Wenn ihr euch die mathematischen Grundsätze für Quersummen, Zahlensysteme und ExOr-Operationen anschaut, kommt ihr bestimmt auch drauf...
    Krieg ich den Lutscher auch per Post? Steh auf Lutscher!

    ...na komm schon, lass mich nicht doof sterben. Vielleicht taugt der Ansatz
    ja wirklich was.
    ...und ja, wenn Du willst per Einschreiben 🙂



  • Signum schrieb:

    ...na komm schon, lass mich nicht doof sterben. Vielleicht taugt der Ansatz ja wirklich was.

    Manche Schulen unterscheiden beim Teilbarkeitstest durch 9 nicht zwischen der Quersumme, was nur die Summe der Ziffern ist und der Endquersumme der Quersummen, was dem Divisionsrest bei Division durch 9 entspricht.
    Ich schätze, er berechnet nur den Divisionsrest bei Division durch 9.



  • wxSkip schrieb:

    Signum schrieb:

    wxSkip schrieb:

    Mal ganz nebenbei: Du machst ne Bignum-Klasse und postest im ANSI-C-Forum? Oder meinst du ein Struct?

    ...weder noch, ich suche einen Algo (siehe erstes posting des Threads)

    Und der soll in C verfasst sein und C++-Klassen verwenden, oder stehe ich auf dem Schlauch? 😉

    ...welche funktionen werden denn wohl in C++ Klassen benutzt?
    Achtung: Hab in meinen Klassen mit den MFC Klassen NIX am Hut.
    Ich benutze memcpy(), strcpy() und alle anderen C funktionen wie in jedem anderen Programm, nur eben gekapselt. Wo ist da der Unterschied.
    Ausserdem suche ich hier einen Algorithmus, am besten in C implementiert.

    Zitat Wikipedia:
    "Ein Algorithmus (auch Lösungsverfahren) ist eine formale Handlungsvorschrift zur Lösung eines Problems oder einer bestimmten Art von Problemen in endlich vielen Schritten"

    Also nochmals:
    - Ich will keine Klasse
    - Ich will keine BigNum implementation
    - Ich will eine Lösung eines allgemenen Problems, wenn es eine solche gibt!



  • volkard schrieb:

    Signum schrieb:

    ...na komm schon, lass mich nicht doof sterben. Vielleicht taugt der Ansatz ja wirklich was.

    Manche Schulen unterscheiden beim Teilbarkeitstest durch 9 nicht zwischen der Quersumme, was nur die Summe der Ziffern ist und der Endquersumme der Quersummen, was dem Divisionsrest bei Division durch 9 entspricht.
    Ich schätze, er berechnet nur den Divisionsrest bei Division durch 9.

    ...also wenn Du mich meinst:
    Ich berechne nix. Aber das würde ich gerne!
    Wen ich erst mal soweit wäre, dann kann ich mir über die unterschiedlichen
    Interprätationen der Quersummen immer noch Gedanken machen.



  • Signum schrieb:

    ...damit Du das Problem verstehst!
    Also, probier es mal, die Quersumme aus dem gepostetem Code zu errechnen, OHNE integrale datentypen (byte, short int, long int,...)!

    Ich kenn doch dein Interface nicht! Und wenn ich es kennen würde, würde ich auch nur das Python-Script von oben 1:1 umsetzen. Völlig sinnlose Übung. Sinnvoller wäre es, wenn du das Problem verstündest 😉



  • Bashar schrieb:

    Signum schrieb:

    ...damit Du das Problem verstehst!
    Also, probier es mal, die Quersumme aus dem gepostetem Code zu errechnen, OHNE integrale datentypen (byte, short int, long int,...)!

    Ich kenn doch dein Interface nicht! Und wenn ich es kennen würde, würde ich auch nur das Python-Script von oben 1:1 umsetzen. Völlig sinnlose Übung. Sinnvoller wäre es, wenn du das Problem verstündest 😉

    ...na gut, Du darfst auch ein Python-Script verwenden, aber bitte posten, damit
    ich mir was abgucken kann! 🙂

    Die Kenntnis des Interfaces ist für die Lösung des Problems übrigens völlig irrelevant.


  • Mod

    Darf ich mal neugierig fragen, wie du in String umwandelst, ohne durch 10 zu teilen?



  • SeppJ schrieb:

    Darf ich mal neugierig fragen, wie du in String umwandelst, ohne durch 10 zu teilen?

    ...da guckste mal in den Quellcode der Java Klasse BigInteger/MutableBigInteger. Die machen
    das fast genau so, nur dass ich mit 8-bit unsigned quantities rechne und nicht mit 32-bit signed quantities.



  • also ich konnte da nur sowas finden

    int digit = MPN.divmod_1(work, work, len, radix);

    😕



  • .-.-.-.-. schrieb:

    also ich konnte da nur sowas finden

    int digit = MPN.divmod_1(work, work, len, radix);

    😕

    ...nö, die funktion heisst "public String toString(int radix)".
    Ich arbeite grundsätzlich mit radix 10. Möchte nur wissen, wer da behauptet
    ich würde in einen String umwandeln ohne durch 10 zu teilen.
    Genau das ist Bestandteil der Umwandlung, und genau das will ich mir aus performance günden ersparen.


  • Mod

    Signum schrieb:

    .-.-.-.-. schrieb:

    also ich konnte da nur sowas finden

    int digit = MPN.divmod_1(work, work, len, radix);

    😕

    ...nö, die funktion heisst "public String toString(int radix)".
    Ich arbeite grundsätzlich mit radix 10. Möchte nur wissen, wer da behauptet
    ich würde in einen String umwandeln ohne durch 10 zu teilen.
    Genau das ist Bestandteil der Umwandlung, und genau das will ich mir aus performance günden ersparen.

    Guck dir mal an, wie toString implementiert ist. Was glaubst du denn, was das macht?

    Aber da die Stringumwandlung ziemlich viel anderes auch macht, rechne doch einfach direkt! Die Funktion zum teilen ist ja offensichtlich da, denn dein toString benutzt sie ja.



  • Signum schrieb:

    .-.-.-.-. schrieb:

    also ich konnte da nur sowas finden

    int digit = MPN.divmod_1(work, work, len, radix);

    😕

    ...nö, die funktion heisst "public String toString(int radix)".

    welche "format(radix, buffer);" aufruft wo ich meine zeile gefunden hab. aber wenn du über den aufbau der java klassen diskutieren willst geh ins java subforum.



  • SeppJ schrieb:

    Signum schrieb:

    .-.-.-.-. schrieb:

    also ich konnte da nur sowas finden

    int digit = MPN.divmod_1(work, work, len, radix);

    😕

    ...nö, die funktion heisst "public String toString(int radix)".
    Ich arbeite grundsätzlich mit radix 10. Möchte nur wissen, wer da behauptet
    ich würde in einen String umwandeln ohne durch 10 zu teilen.
    Genau das ist Bestandteil der Umwandlung, und genau das will ich mir aus performance günden ersparen.

    Guck dir mal an, wie toString implementiert ist. Was glaubst du denn, was das macht?

    Aber da die Stringumwandlung ziemlich viel anderes auch macht, rechne doch einfach direkt! Die Funktion zum teilen ist ja offensichtlich da, denn dein toString benutzt sie ja.

    ...ochhh Sepp! 😃
    Und es stand geschrieben:
    "...und genau das will ich mir aus performance günden ersparen"



  • Signum schrieb:

    ...na gut, Du darfst auch ein Python-Script verwenden, aber bitte posten, damit
    ich mir was abgucken kann! 🙂

    Die Kenntnis des Interfaces ist für die Lösung des Problems übrigens völlig irrelevant.

    Ich habe das Gefühl, wir reden hier mächtig aneinander vorbei. Du scheinst von mir zu erwarten, dass ich dir eine Lowlevel-Lösung anbiete, die direkt mit deinen Bytes herumhantiert und damit die Quersumme berechnet. Das hab ich aber nie vorgeschlagen, im Gegenteil.

    Du hast gesagt, deine Library kann schon Grundrechenarten. Wir brauchen: Vergleich mit 0, Addition, Modulo und Division. Dann sieht dein Algorithmus so aus:

    // Eingabe: N
    Erzeuge zwei Bignums: X als Kopie von N, Q mit dem Initialwert 0
    while (X ist nicht 0) {
      Inkrementiere Q um den Wert von X modulo 10
      Teile X durch 10
    }
    // Ausgabe: Q
    

    Die natürlichsprachlichen Elemente werden Aufrufe deiner Funktionen, wie auch immer sie heißen, my_bignum_divide vielleicht. Alles high-level. Dass das so funktionieren muss, zeigt das Python-Script, das ich auf der ersten Seite gepostet habe. Das macht nämlich im wesentlichen auch nichts anderes, hat aber noch einiges an Overhead seitens des Interpreters. Wenn deine Grundoperationen also effizient implementiert sind, solltest du auf ähnliche Laufzeiten kommen.



  • Signum schrieb:

    SeppJ schrieb:

    Signum schrieb:

    .-.-.-.-. schrieb:

    also ich konnte da nur sowas finden

    int digit = MPN.divmod_1(work, work, len, radix);

    😕

    ...nö, die funktion heisst "public String toString(int radix)".
    Ich arbeite grundsätzlich mit radix 10. Möchte nur wissen, wer da behauptet
    ich würde in einen String umwandeln ohne durch 10 zu teilen.
    Genau das ist Bestandteil der Umwandlung, und genau das will ich mir aus performance günden ersparen.

    Guck dir mal an, wie toString implementiert ist. Was glaubst du denn, was das macht?

    Aber da die Stringumwandlung ziemlich viel anderes auch macht, rechne doch einfach direkt! Die Funktion zum teilen ist ja offensichtlich da, denn dein toString benutzt sie ja.

    ...ochhh Sepp! 😃
    Und es stand geschrieben:
    "...und genau das will ich mir aus performance günden ersparen"

    Nachtrag:
    Was hab ich denn von einer Division durch 10?
    Das Ergebnis ist eine Zahl in zweier komplement Darstellung und wir stehen wieder am Anfang 😉


  • Mod

    Signum schrieb:

    Nachtrag:
    Was hab ich denn von einer Division durch 10?
    Das Ergebnis ist eine Zahl in zweier komplement Darstellung und wir stehen wieder am Anfang 😉

    Ich glaube ich kann dir nicht helfen. Du bemühst dich ja noch nicht einmal.


Anmelden zum Antworten