Schulaufgabe



  • seldon schrieb:

    Du versuchst, einen float als int auszugeben. %i ist nicht der richtige Format-Spezifikator.

    Und Prompt sind wir bei den I/O-Streams von C++ angelangt.



  • Hacker schrieb:

    seldon schrieb:

    Du versuchst, einen float als int auszugeben. %i ist nicht der richtige Format-Spezifikator.

    Und Prompt sind wir bei den I/O-Streams von C++ angelangt.

    vielen dank



  • Ah, das ist hier ja das C++-Forum. Da hat der Code, so wie er da steht, eigentlich nichts zu suchen; das passt besser ins C-Forum. In diesem speziellen Fall beschränkt sich der Unterschied allerdings auf die Ausgabe.

    Ansonsten scheint mir das mit der Schleife recht umständlich. Ein kleines bisschen Mathematik bringt das auf O(1) runter:

    #include <iostream>
    
    int summe_bis(int n) {
      return n * (n + 1) / 2;
    }
    
    double durchschnitt_zwischen(int unten, int oben) {
      return (summe_bis(oben) - summe_bis(unten - 1)) / (oben - unten + 1.0);
    }
    
    int main() {
      std::cout << durchschnitt_zwischen(7, 39) << '\n';
    }
    


  • seldon schrieb:

    return n * (n + 1) / 2;
    

    Der ist gut, den kannte ich noch nicht 🙂



  • Das sollte man eigentlich in der Schule gelernt haben: Gaußsche Summenformel



  • Th69 schrieb:

    Das sollte man eigentlich in der Schule gelernt haben: Gaußsche Summenformel

    Hatten wir nie. Aber die Anekdote kenn ich 😃



  • seldon schrieb:

    Ansonsten scheint mir das mit der Schleife recht umständlich. Ein kleines bisschen Mathematik bringt das auf O(1) runter

    Was in der Aufgabe aber nicht erwünscht ist.



  • hmpff schrieb:

    seldon schrieb:

    Ansonsten scheint mir das mit der Schleife recht umständlich. Ein kleines bisschen Mathematik bringt das auf O(1) runter

    Was in der Aufgabe aber nicht erwünscht ist.

    Was er nicht behauptet hat. Die Version mit der Schleife hab ich vorgemacht.



  • seldon schrieb:

    Ah, das ist hier ja das C++-Forum. Da hat der Code, so wie er da steht, eigentlich nichts zu suchen; das passt besser ins C-Forum. In diesem speziellen Fall beschränkt sich der Unterschied allerdings auf die Ausgabe.

    Ansonsten scheint mir das mit der Schleife recht umständlich. Ein kleines bisschen Mathematik bringt das auf O(1) runter:

    #include <iostream>
    
    int summe_bis(int n) {
      return n * (n + 1) / 2;
    }
    
    double durchschnitt_zwischen(int unten, int oben) {
      return (summe_bis(oben) - summe_bis(unten - 1)) / (oben - unten + 1.0);
    }
    
    int main() {
      std::cout << durchschnitt_zwischen(7, 39) << '\n';
    }
    

    Das ist aber ziemlich umständlich. 😉

    double durchschnitt_zwischen(int unten, int oben) {
      return (oben+unten)/2.0;
    }
    
    int main() {
      std::cout << durchschnitt_zwischen(7, 39) << '\n';
    }
    

    summe_bis(oben) - summe_bis(unten - 1)) / (oben - unten + 1.0) =
    (oben*(oben+1)/2 - (unten-1)unten /2 )/(oben-unten+1) =
    (oben²+oben - unten² + unten)/2
    (oben-unten+1) =
    ((oben-unten)(oben+unten) + oben + unten)/2(oben-unten+1) =
    (oben+unten)(oben-unten+1)/2(oben-unten+1) =
    (oben+unten)/2



  • Ha! Das hatte ich nicht gesehen. 👍


Anmelden zum Antworten