Funktion gesucht



  • freakC++ schrieb:

    Dazu habe ich folgende Rechnungen durchgeführt:
    (65-32)*53^0 + (66-32)*53^1 + (73-32)*53^2 + (84-32)*53^3 + (82-32)*53^3

    Schau dir die Zeile nochmal genau an... dann siehst du was falsch ist.


  • Mod

    Zunächst einmal muss der jeweils letzte Term natürlich mit 53^4 multipliziert werden. Weiterhin habe ich keine Ahnung, wo die Zahl 4982 herkommt. Schreibfehler?

    Und da du jetzt in magic1 die ersten 5 statt 4 Zeichen hast, musst du bei der Abfrage natürlich auf >4 prüfen und gegebenenfalls auch 5 von depth abziehen.

    Und du hast das U vergessen.



  • SeppJ schrieb:

    Schreibfehler?

    Ja, das war ein Schreibfehler.

    Ich habe nun zunächst in die eine Gleichung die Buchstaben "ABITU" gesteckt. Es ergibt sich folgende Gleichung:

    (65-32)*53^0 + (66-32)*53^1 + (73-32)*53^2 + (84-32)*53^3 + (85-32)*53^4 = 426054101

    In die zweite Gleichung kommt dann "R 2011":

    (82-32)*53^0 + (32-32)*53^1 + (50-32)*53^2 + (48-32)*53^3 + (49-32)*53^4 + (49-32)*53^5 = 7245894202

    Das Ergebnis stimmt aber wieder nur bis "ABIT" . Danach ist alles falsch! Diesmal stimmen aber alle Potenzen und es gibt keine Schreibfehler mehr. Warum erscheint beispielsweise das "UR" nicht?

    Depth muss auch nicht angepasst werden, weil in der ersten Zahl die ersten 4 Buchstaben gespeichert werden!?!

    Was sehe ich da nicht?

    lg, freakC++



  • freakC++ schrieb:

    Ich habe nun zunächst in die eine Gleichung die Buchstaben "ABITU" gesteckt.
    [...]
    Depth muss auch nicht angepasst werden, weil in der ersten Zahl die ersten 4 Buchstaben gespeichert werden!?!

    Aus meiner Sicht sind "ABITU" nicht 4 Buchstaben...

    Edit:
    Hast du SeppJs Beitrag durchgelesen?

    SeppJ schrieb:

    Da ich die 0 durch eine 32 ersetzt habe, hast du Werte zwischen 32 (für das Leerzeichen) und 85 (für das U). Um Platz zu sparen, kann ich daher immer erst 32 abziehen und erhalte dann maximal Werte bis 53 (siehe Rechnung oben). Und hier finde ich auch einen Fehler bei mir: Damit "Ziffern" in meinem Zahlensystem Werte zwischen 0 und 53 haben können, müsste ich ein 54er System nehmen. Die Rechnung muss dementsprechend geändert werden, wenn du "ABITUR 2011" haben willst.



  • lustig schrieb:

    [Aus meiner Sicht sind "ABITU" nicht 4 Buchstaben...

    Da stimme ich dir zu! Verzählt. Also habe ich noch schnell depth angepasst und ein 54 System erstellt. Nun habe ich endlich "ABITUR". Doch im Gegenzug gibts jetzt Probleme mit der Zahl. Die letzte 1 kommt nicht. Dast ist auch klar, weil ich sie in dieser Formel nicht berücksichtigt habe:

    (82-32)*54^0 + (32-32)*54^1 + (50-32)*54^2 + (48-32)*54^3 + (49-32)*54^4

    Wenn ich sie nun noch anhänge, sieht es so aus:

    (82-32)*54^0 + (32-32)*54^1 + (50-32)*54^2 + (48-32)*54^3 + (49-32)*54^4 + (49-32)*54^5

    Jetzt kommt aber wieder Mist raus? Ist die Zahl zu groß oder warum klappts mit der letzten 1 nicht? Eigentlich müsste doch alles stimmen.

    lg, freakC++


  • Mod

    freakC++ schrieb:

    Jetzt kommt aber wieder Mist raus? Ist die Zahl zu groß oder warum klappts mit der letzten 1 nicht? Eigentlich müsste doch alles stimmen.

    Zeig mal bitte den Code so wie er jetzt ist und sag auch was sizeof(long) und sizeof(long long) bei dir sind (falls es bei dir long long gibt).



  • Rechne mal 54^5 aus und schau mal nach, ob diese noch in ein ulong (32bit) paßt 😉



  • So sieht der Code aus, wenn die 1 fehlt, aber alles andere korrekt angezeigt wird:

    char getchar(unsigned depth) 
    { 
      const unsigned long magic1=458971521UL; 
      const unsigned long magic2=147123914UL;
      unsigned long magic=magic1; 
      if (depth>4){ 
        depth-=5; 
        magic=magic2; 
      } 
    
      return magic/static_cast<unsigned long>(pow_rek(54, depth)) - 54*(magic/static_cast<unsigned long>(pow_rek(54, depth+1))) + 32; 
    }
    

    Wenn ich die letzte 1 noch anhänge, dann ändere ich ausschließlich "magic2"

    const unsigned long magic2=7952929322UL;
    

    Nun erscheint aber nur noch "ABITU" und danach folgt Blödsinn.

    sizeof(long) = 4
    sizeof(long long) = 8

    Vielen Dank
    lg, freakC++


  • Mod

    7952929322 ist zu groß für einen long auf deinem System.

    Du compilierst doch immer mit allen Compilerwarnungen, wie man es dir bestimmt schon oft gesagt wurde, oder 😉 ?



  • Klar!! Die einzige Warnung, die mein Compiler gibt, war:

    'return': Konvertierung von 'unsigned long' in 'char', möglicher Datenverlust

    Vielen Dank! Ich habe die 1 jetzt einfach so drangehängt!
    lg, freakC++


Anmelden zum Antworten