Berechnung einer Summe von 1 bis 100



  • Hallo, ich kann leider nicht erkennen, wie hier von 1 bis 100 gezählt wird.

    int n = {100};
    int sum {n*(n+1)/2};
    

    Wie wird der Inhalt der geschweiften Klammern berechnet?
    Für eine Aufklärung, wäre ich dankbar.



  • @Lumberjack sagte in Berechnung einer Summe von 1 bis 100:

    Hallo, ich kann leider nicht erkennen, wie hier von 1 bis 100 gezählt wird.

    int n = {100};
    int sum {n*(n+1)/2};
    

    Das ist die Summenformel, mit der man das Ergebnis direkt berechnen kann, anstatt es iterativ in einer Schleife zu ermitteln. Das ist ein mathematisches Ding und keine Besonderheit von C++.

    Die Grundidee hinter dieser Summelformel ist die erste Hälfte der Zahlen von vorne nach hinten und die zweite von hinten nach vorne laufen zu lassen, so dass man sowas wie (1 + 99) + (2 + 98) + (3 + 97) ... bekommt. So kann man sich die Formel leicht selbst erschliessen.

    Edit: Achja, und falls dich die geschweiften Klammern irritieren, das ist eine Form der Initialisierung (uniform initialization) und bedeutet in diesem Kontext exakt dasselbe wie:

    int sum = n * (n + 1) / 2;
    


  • @Finnegan sagte in Berechnung einer Summe von 1 bis 100:

    @Lumberjack sagte in Berechnung einer Summe von 1 bis 100:

    Hallo, ich kann leider nicht erkennen, wie hier von 1 bis 100 gezählt wird.

    int n = {100};
    int sum {n*(n+1)/2};
    

    Das ist die Summenformel, mit der man das Ergebnis direkt berechnen kann, anstatt es iterativ in einer Schleife zu ermitteln. Das ist ein mathematisches Ding und keine Besonderheit von C++.

    Die Grundidee hinter dieser Summelformel ist die erste Hälfte der Zahlen von vorne nach hinten und die zweite von hinten nach vorne laufen zu lassen, so dass man sowas wie (1 + 99) + (2 + 98) + (3 + 97) ... bekommt. So kann man sich die Formel leicht selbst erschliessen.

    Edit: Achja, und falls dich die geschweiften Klammern irritieren, das ist eine Form der Initialisierung (uniform initialization) und bedeutet in diesem Kontext exakt dasselbe wie:

    int sum = n * (n + 1) / 2;
    

    Ok, aber wenn der Wert "n" wie hier auf 100 steht, bin ich nach der Rechnung bei 5050.



  • @Lumberjack sagte in Berechnung einer Summe von 1 bis 100:

    Ok, aber wenn der Wert "n" wie hier auf 100 steht, bin ich nach der Rechnung bei 5050.

    Ja, das liegt daran dass 1+2+3...+100=50501 + 2 + 3 ... + 100 = 5050 ist 😉

    1+2+3+...+100=(1+99)+(2+98)+(3+97)+...+(50+50)50+100=5010050+100=50501 + 2 + 3 + ... + 100 = (1 + 99) + (2 + 98) + (3 + 97) + ... + (50+50) - 50 + 100 = 50 \cdot 100 - 50 + 100 = 5050 ... -50 weil die 50 zweimal gezählt wurde und +100 weil am Anfang bei 99 begonnen wurde.

    Edit: Das kannste jetzt umformen zu 100(100+1)2100 \cdot (100 + 1) \over 2 ... und wenn du das Ganze dann Allgemein machst für 1+2+3+...+n1 + 2 + 3 + ... + n, kommste am Ende auf die Summenformel n(n+1)2n\cdot (n+ 1) \over 2.



  • @Finnegan Ok, war gedanklich auf etwas anderes eingestellt.
    Würde man mit einem cout << ... << die Zahlen 1 bis 100 so ausgeben können?



  • @Lumberjack sagte in Berechnung einer Summe von 1 bis 100:

    @Finnegan Ok, war gedanklich auf etwas anderes eingestellt.
    Würde man mit einem cout << ... << die Zahlen 1 bis 100 so ausgeben können?

    Nein. Die Formel ist die direkte Berechnung der Summe. Wenn du die Zahlen ausgeben willst, dann musst du das z.B. in einer Schleife machen.

    Edit: Das bekommste hin, oder? 1 + 2 + 3 ... in ner Schleife? for... und sowas.



  • @Finnegan sagte in Berechnung einer Summe von 1 bis 100:

    @Lumberjack sagte in Berechnung einer Summe von 1 bis 100:

    @Finnegan Ok, war gedanklich auf etwas anderes eingestellt.
    Würde man mit einem cout << ... << die Zahlen 1 bis 100 so ausgeben können?

    Nein. Die Formel ist die direkte Berechnung der Summe. Wenn du die Zahlen ausgeben willst, dann musst du das z.B. in einer Schleife machen.

    Ah, okay. Dann habe ich mich echt auf etwas falsches eingestellt.
    Aber nebenbei die Gaußsche Summenformel gelernt. Vielen Dank! 😁

    Edit: Ja, bin gerade alle möglichen mal durchgegangen.



  • @Lumberjack sagte in Berechnung einer Summe von 1 bis 100:

    Ah, okay. Dann habe ich mich echt auf etwas falsches eingestellt.
    Aber nebenbei die Gaußsche Summenformel gelernt. Vielen Dank! 😁

    Ein Klassiker. Nützlich zu kennen. Noch nützlicher ist allerdings die Erkenntnis, dass man manchmal mit deutlich weniger Rechnenoperationen zum selben Ergebnis kommen kann. Besonders wenn man flotte Computerprogramme schreiben will. Diese Summenformel ist da nur ein besonders anschauliches Beispiel unter vielen 😉

    Edit: Interessante Anekdote am Rande - zumindest der Clang-Compiler kennt eine Variante dieser Summenformel auch als Optimierung. Wenn man die Zahlen in ner Schleife aufsummiert, dann wird im Maschinencode stattdessen das Ergebnis direkt berechnet - ohne Schleifen-Maschinencode zu generieren: https://godbolt.org/z/8dEP63Mve ... nicht exakt die Gaussformel, aber wahrscheinlich eine Verallgemeinerung für eine ganze Klasse solcher Summen.



  • @Lumberjack sagte in Berechnung einer Summe von 1 bis 100:

    Aber nebenbei die Gaußsche Summenformel gelernt.

    Kleine mathematische Nebenbemerkung: Man kann die Gaußsche Summenformel mittels vollständiger Induktion beweisen.

    https://de.wikipedia.org/wiki/Vollständige_Induktion#Gaußsche_Summenformel



  • @Finnegan sagte in Berechnung einer Summe von 1 bis 100:

    1+2+3+...+100=(1+99)+(2+98)+(3+97)+...+(50+50)50+100=5010050+100=50501 + 2 + 3 + ... + 100 = (1 + 99) + (2 + 98) + (3 + 97) + ... + (50+50) - 50 + 100 = 50 \cdot 100 - 50 + 100 = 5050 ... -50 weil die 50 zweimal gezählt wurde und +100 weil am Anfang bei 99 begonnen wurde.

    Schöner ist es, wenn man die Summe etwas anders sortiert.

    (0+100)+(1+99)++(49+51)+50=50100+50(0+100)+(1+99)+\cdots+(49+51)+50=50\cdot100+50

    Wir finden somit folgende Formel

    i=1Ni=N2N+N2=N22+N2=N2+N2=N(N+1)2\sum_{i=1}^{N} i=\frac{N}{2}\cdot N+\frac{N}{2}=\frac{N^2}{2}+\frac{N}{2}=\frac{N^2+N}{2}=\frac{N(N+1)}{2}

    Anmerkung \underbrace funktioniert nicht in den LaTeX Formel 😞



  • @john-0 sagte in Berechnung einer Summe von 1 bis 100:

    Schöner ist es, wenn man die Summe etwas anders sortiert.

    Ja, ist auf jeden Fall schöner. Hatte das aus dem Kopf runtergeschrieben und nicht allzu viel eigene Überlegungen reingesteckt. Wär mir aber wahrscheinlich aufgefallen, wenn ich's allgemein mit den NNs gemacht hätte. Bin kein Fan von nackten Zahlen, da bekomm ich immer Flimmern vor den Augen und tu mich schwer, Strukturen zu erkennen 😉


Log in to reply