Quersummenberechnung



  • SeppJ schrieb:

    rage_quit schrieb:

    SeppJ schrieb:

    Darf ich als Alternative die Quersumme zur Basis 256 vorschlagen?

    für was soll die gut sein?

    Wozu soll die Quersumme zur Basis 10 gut sein? Doch wohl als Prüfsumme oder für Teilbarkeitsregeln. Prüfsumme geht mit Basis 256 genauso und Teilbarkeitsregeln entfällt im Gegensatz zum Dezimalsystem "nur" die Teilbarkeit durch 9. Diese kann man durch zweimaliges prüfen der Teilbarkeit durch 3 emulieren. Dafür gewinnt man Teilbarkeitsregeln für 5, 15, 17, 51, 85 und 255.

    hättest du da sowas wie eine tabelle/link? kannte bisher nur die Teilbarkeitsregeln im Dezimalsystem?



  • Heimelchen schrieb:

    Wenn du deine Zahl also Modulo 9 gerechnet kriegst, könntest du daraus die Quersumme berechnen. Ob das schneller geht, ist die große Frage...

    Ja, es wäre viel viel schneller. Aber nicht richtig.
    qs(16777216)=37 und nicht nur 1.



  • @bashar
    Versuche folgende Quersumme zu berechnen, ohne für magnitude integrale datentypen zu verwenden:

    void main(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;
    
        // ...so gehts nicht!
        for(int i = 0; i < size; i++)
        {
            digit = magnitude[i];
            while(digit != 0x00)
            {
                Your_Crossfoot += digit % 10;
                digit /= 10;
            }
        }
    
        assert(Your_Crossfoot == Correct_Crossfoot);
    }
    

    @Sepp
    Ich benutze die Schoolbook Division nach Donald Knuth "The Art of Computer Programming II"

    @Heimelchen
    NEIN!

    @volkard
    Die Division kommt da oft genug vor, genau das will ich vermeiden!
    BigNumMitNStellen/10:
    Ja, hab eine eigene funktion. Dies ist ein Sonderfall, indem der Divisor geau so gross ist wie ein Byte des Dividenden


  • Mod

    401301201 schrieb:

    SeppJ schrieb:

    Dafür gewinnt man Teilbarkeitsregeln für 5, 15, 17, 51, 85 und 255.

    hättest du da sowas wie eine tabelle/link? kannte bisher nur die Teilbarkeitsregeln im Dezimalsystem?

    Link:
    http://de.wikipedia.org/wiki/Quersumme#Quersummensatz



  • 401301201 schrieb:

    SeppJ schrieb:

    rage_quit schrieb:

    SeppJ schrieb:

    Darf ich als Alternative die Quersumme zur Basis 256 vorschlagen?

    für was soll die gut sein?

    Wozu soll die Quersumme zur Basis 10 gut sein? Doch wohl als Prüfsumme oder für Teilbarkeitsregeln. Prüfsumme geht mit Basis 256 genauso und Teilbarkeitsregeln entfällt im Gegensatz zum Dezimalsystem "nur" die Teilbarkeit durch 9. Diese kann man durch zweimaliges prüfen der Teilbarkeit durch 3 emulieren. Dafür gewinnt man Teilbarkeitsregeln für 5, 15, 17, 51, 85 und 255.

    hättest du da sowas wie eine tabelle/link? kannte bisher nur die Teilbarkeitsregeln im Dezimalsystem?

    Na das wäre doch mal ein Ansatz!
    Wenn man das Ergebnis der Quersumme einfach ins Dezimalsystem umrechnen kann wäre mir schon geholfen!


  • Mod

    volkard schrieb:

    Ich wiederhole: "Dafür gewinnt man eine Teilbarkeitsregel für 5".
    🤡

    Ups, ja :p .

    Aber immerhin ist die Regel mit der 5 von gänzlich anderer Art in den zwei Fällen. So gesehen würde man mit 256 noch viel mehr Teilbarkeitsregeln bekommen, die dann eben nicht auf der Quersumme beruhen.



  • Signum schrieb:

    @Heimelchen
    NEIN!

    Ok, dann lass ich's.


  • Mod

    Signum schrieb:

    Wenn man das Ergebnis der Quersumme einfach ins Dezimalsystem umrechnen kann wäre mir schon geholfen!

    Nein, das ist nicht möglich, eine Quersumme zwischen Systemen umzurechnen. Entweder kannst du mit der Quersumme in 256 auch das machen was du was du mit der 10er-Quersumme machen willst, oder nicht.



  • sei doch nicht so dünnhäutig!



  • Signum schrieb:

    @bashar
    Versuche folgende Quersumme zu berechnen, ohne für magnitude integrale datentypen zu verwenden:

    void main(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;
    
        // ...so gehts nicht!
        for(int i = 0; i < size; i++)
        {
            digit = magnitude[i];
            while(digit != 0x00)
            {
                Your_Crossfoot += digit % 10;
                digit /= 10;
            }
        }
        
        assert(Your_Crossfoot == Correct_Crossfoot);
    }
    

    Versteh ich nicht. Was hat dein Code mit irgendwas, das ich gesagt habe, zu tun? Du musst die ganze Zahl durch 10 teilen, nicht jedes Byte für sich.



  • Ich bin garantiert nicht dünnhäutig. Aber wenn dem Threadersteller eine Zeile der gescheiten Erläuterung zu aufwändig ist, behalt ich meine Lösungsansätze für mich 🕶



  • Bashar schrieb:

    Signum schrieb:

    @bashar
    Versuche folgende Quersumme zu berechnen, ohne für magnitude integrale datentypen zu verwenden:

    void main(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;
    
        // ...so gehts nicht!
        for(int i = 0; i < size; i++)
        {
            digit = magnitude[i];
            while(digit != 0x00)
            {
                Your_Crossfoot += digit % 10;
                digit /= 10;
            }
        }
        
        assert(Your_Crossfoot == Correct_Crossfoot);
    }
    

    Versteh ich nicht. Was hat dein Code mit irgendwas, das ich gesagt habe, zu tun? Du musst die ganze Zahl durch 10 teilen, nicht jedes Byte für sich.

    ...na dann machs halt mal!



  • Heimelchen schrieb:

    Ich bin garantiert nicht dünnhäutig. Aber wenn dem Threadersteller eine Zeile der gescheiten Erläuterung zu aufwändig ist, behalt ich meine Lösungsansätze für mich 🕶

    ...wenn Dein Ansatz funzt, krigste 'n Lutscher 🙂



  • Bashar schrieb:

    Versteh ich nicht. Was hat dein Code mit irgendwas, das ich gesagt habe, zu tun? Du musst die ganze Zahl durch 10 teilen, nicht jedes Byte für sich.

    ja das versteh ich schon... wenn du python code im ansi c forum postest 😉

    @Signum dir wird hier sicher keiner ne bignum lib coden wär ja auch noch schöner! ist auch nicht so als gäbs das noch nicht...



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



  • Signum schrieb:

    ...wenn Dein Ansatz funzt, krigste 'n Lutscher 🙂

    meine eltern haben immer gesagt ich darf von fremden keine süßigkeiten annehmen :p



  • 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!



  • Bashar schrieb:

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

    ???



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



  • 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!


Anmelden zum Antworten