log_2 und Wurzel ziehen [gelöst]



  • Hallo liebe Community ich hänge gerade bei der letzten Aufgabe meine Hausaufgabe fest und hoffe Ihr könntet mir weiterhelfen.

    Aufgabe : Schreiben und kommentieren sie ein C++-Programm, das den Ausdruck

                                           ⌈   sqrt  ( ⌈ log_2 (x) + xy⌉) ⌉
    

    berechnet. Hierbei ist ⌈.⌉ die obere Gaußklammer. Die positiven ganzen Zahlen x und y sollen vom Benutzer eingegeben werden. Die einzige arithemtische Operation , die sie verwenden dürfen, ist ++. Die einzigen Zahlkonstanten, die Sie verwenden dürfen, sind 0 und 1.

    Ich würde mich über ein paar Tipps wirklich freuen. Danke im vorraus.

    Gruß David


  • Mod

    Ein Kommilitone von dir war ein paar Tage schneller:
    https://www.c-plusplus.net/forum/topic/348614/sqrt-log-und-round-ohne-math-h

    Wenigstens gibst du die vollständige Aufgabenstellung an, da sieht man endlich, was wohl gemeint ist.

    Sieht so aus, als wäre der Sinn der Aufgabe, die ganze Arithmetik von den Grundpostulaten her nachzuprogrammieren. * Würg * Prinzipiell keine ganz schlechte Programmierübung, da das sehr gut funktionsorientiertes Denken lehrt, aber zugleich auch eine Fleißaufgabe, an der man tagelang programmieren wird.


  • Mod

    @SeppJ sagte in log_2 und Wurzel ziehen:

    Ein Kommilitone von dir war ein paar Tage schneller:
    https://www.c-plusplus.net/forum/topic/348614/sqrt-log-und-round-ohne-math-h

    Wenigstens gibst du die vollständige Aufgabenstellung an, da sieht man endlich, was wohl gemeint ist.

    Sieht so aus, als wäre der Sinn der Aufgabe, die ganze Arithmetik von den Grundpostulaten her nachzuprogrammieren. * Würg * Prinzipiell keine ganz schlechte Programmierübung, da das sehr gut funktionsorientiertes Denken lehrt, aber zugleich auch eine Fleißaufgabe, an der man tagelang programmieren wird.

    Tagelang halte ich für übertrieben. Wenn man die grundlegende Idee und die Aufteilung in elementare Funktionen verstanden hat, ist das eigentliche Programmieren recht einfach.
    Hier ein Beispiel für eine Subtraktionsfunktion (die der Ersteller so nicht braucht) zur Illustration:

    unsigned sub(unsigned x, unsigned y) {
      unsigned result = 0;
      for (unsigned i = y; i != x; ++i)
        ++result;
      return result; // x - y
    }
    

    Die Originalaufgabe kann man ohne Weiteres noch etwas verschärfen, indem weder 1 als Konstante, noch Vergleiche ausser == bzw. != zugelassen sind.



  • Dieser Beitrag wurde gelöscht!

  • Mod

    @yahendrik sagte in log_2 und Wurzel ziehen:
    gelöscht

    Wenn du schon die Hausaufgaben für andere machst, dann bitte so, dass es uns überzeugt. Ich möchte eine Lösung sehen, die auch für x=4294967263 und y=1 in absehbarer Zeit fertig wird.



  • Okay, ich nehme es raus. Es sollten auch nur ein paar (gutgemeinte) Tipps sein. Vielleicht bastel ich heute abend noch ein wenig rum.


  • Mod

    @yahendrik : Und lass solche Krücken wie "true" als Alternative zur 1. Die Idee ist hier, dass du die gesamte Arithmetik an Grundpostulaten wie "0 ist eine natürlich Zahl" und "auf jede natürliche Zahl folgt eine andere" aufziehen kannst (Hier etwas salopp gesprochen. In der der Mathematik ist das etwas genauer formuliert, aber ist dann auch gleich eine lange Liste). Ganz ohne Tricks mit interner Booldarstellung in Computern.

    Von dort ausgehend musst du aber noch ein bisschen weiterdenken, denn mit rein axiomatischer Definition von beispielsweise der Addition rechnest du dich tot, wie camper schon sagte.



  • @SeppJ Ich denke nicht, dass ich bei dem geposteten Code auch nur einen bool (direkt) verwendet habe. Es war eben ein Schnellschuss, um „ aber zugleich auch eine Fleißaufgabe, an der man tagelang programmieren wird” zu widerlegen.
    Auch habe ich nicht behauptet, eine gute oder gar perfekte Lösung zu haben.
    Seis drum.


  • Mod

    Ein Variation zum Thema "alle Schleifen sind irgendwie gleich":

    template <typename R0, typename Cond, typename Step>
    auto func(unsigned i0, R0 r0, Cond cond, Step step) {
     return [=](unsigned x, unsigned y=0) {
       auto i = i0;
       auto j = r0(x);
       while (cond(i, x, y))
         step(i, j, x);
       return j;
     };
    }
    
    auto add = func(0, [](auto x) { return x; },
                      [](auto i, auto, auto y) { return i != y; },
                      [](auto& i, auto& j, auto) { ++i; ++j; });
    auto mul = func(0, [](auto x) { return 0; },
                      [](auto i, auto, auto y) { return i != y; },
                      [](auto& i, auto& j, auto x) { ++i; j = add(j, x); });
    auto lg2 = func(1, [](auto x) { return 0; },
                      [](auto i, auto x, auto) { return i < x; },
                      [](auto& i, auto& j, auto) { i = add(i, i); ++j; });
    auto srt = func(0, [](auto x) { return 0; },
                      [](auto i, auto x, auto) { return i < x; },
                      [](auto& i, auto& j, auto) { i = add(i, j); ++j; i = add(i, j); });
    
    #include <iostream>
    
    int main() {
     unsigned x, y;
     std::cout << "x y = ";
     std::cin >> x >> y;
     std::cout << "\nErgebnis: " << srt(add(lg2(x), mul(x,y))) << '\n';
    }
    

    Jemand, der diesen Code auseinandernehmen kann, brauchte sowieso keine Hilfe, also sollte es kein Problem sein, das zu posten. Hatte erst eine Makroversion, das war aber zu leserlich.



  • @SeppJ Hahaha ist ja cool 🙂



  • Danke nochmal an alle tut mir leid das meine Antwort so lange gedauert hat . Ich dachte ich kriege eine e-mail nachdem eine Antwort eingetroffen ist.

    Danke
    Gruß David


Anmelden zum Antworten