Wie gibt man in c++ die Addition aller Elemente der For-Schleife aus?

4 Antworten

Die Antwort von Youkakun ist denke ich perfekt und beantwortet deine Frage ausreichend.

Hier aber noch mal eine weitere Möglichkeit, wie man eine sog. "Dreieckszahl" etwas cleverer ausrechnen kann:

unsigned sum_tri(unsigned n){
return n * (n + 1) / 2;
}

Diese Methode kommt völlig ohne Schleifen und Rekursion aus!

http://de.wikipedia.org/wiki/Dreieckszahl

Aber wie üblich solltest du bei solchen Spielereien immer auf mögliche Überläufe achten. (am besten nicht mal ansatzweise in die Nähe von INT_MAX kommen) :)


Youkakun  12.06.2015, 01:21

Ich hätte noch so kleinlich sein können, bei sum_iter zu Anfang auf >1 prüfen zu können (sonst return n), sum_iter + sum_gauss zu inlinen & sum_rec zu static und für die Variablen register zu verwenden, um auf jegliche Fehloptimierung des Compilers einzugehen, aber daran denkt man erst später ;)

1
TeeTier  12.06.2015, 06:42
@Youkakun

Na toll, jetzt sehe ich erst, dass du in deinem Kommentar die (fast) baugleiche Funktion drin hast. (gauss)

Da hätte ich mir meine Antwort auch gleich sparen können. :)

0
Youkakun  12.06.2015, 06:54
@TeeTier

Naja, du hast den Ursprung der Gaußschen Summenformel aufgezeigt und auf den Überlauf hingewiesen, ist schon ok.

1
unsigned sum_iter(unsigned n){
unsigned x = 0;
for(unsigned i = 1; i <= n; x += i++);
return x;
}

unsigned sum_rec(unsigned n){
return n > 1 ? n + sum_rec(n-1) : n;
}

charles2520 
Beitragsersteller
 11.06.2015, 20:02

erst mal Danke.. leider kommt bei der rekursiven Version ein anderer Wert raus..:( Ich habe versucht, die Gaußsche Summenformel einzubringen, aber das klappt nicht...

0
Youkakun  11.06.2015, 20:49
@charles2520

Bei der rekursiven sollte aber kein anderer Wert rauskommen. Hier mal ein vollständiger Test:

#include <iostream>

unsigned sum_iter(unsigned n){
unsigned x = 0;
for(unsigned i = 1; i <= n; x += i++);
return x;
}

unsigned sum_rec(unsigned n){
return n > 1 ? n + sum_rec(n-1) : n;
}

unsigned sum_gauss(unsigned n){
return (n*n + n) >> 1;
}

int main(){
for(unsigned i = 0; i < 12; ++i)
std::cout << sum_iter(i) << " == " << sum_rec(i) << " == " << sum_gauss(i) << std::endl;
return 0;
}

Ausgabe:

0 == 0 == 0
1 == 1 == 1
3 == 3 == 3
6 == 6 == 6
10 == 10 == 10
15 == 15 == 15
21 == 21 == 21
28 == 28 == 28
36 == 36 == 36
45 == 45 == 45
55 == 55 == 55
66 == 66 == 66

1

int func (int a){ int ausgabe,i; i=1; for (i=1,i<=a,i++){ ausgabe=+i; /* es geht natürlich auch ausgabe = ausgabe + i;*/ } return ausgabe; }


charles2520 
Beitragsersteller
 11.06.2015, 18:52

funktioniert leider nicht.. Der debugger bemängelt, dass "ausgabe" nicht initalisiert wurde

0
EnderCookie09  11.06.2015, 19:07
@charles2520

geht das?:

int func (int a){ int ausgabe,i; i=1; ausgabe = 0; for (i=1,i<=a,i++){ ausgabe=+i; /* es geht natürlich auch ausgabe = ausgabe + i;*/ } return ausgabe; }

0

Du schreibst vor die Vorschleife ein int b; , und in die Vorschleife dann ein b+=i; am ende Returnst du b.


charles2520 
Beitragsersteller
 11.06.2015, 19:02

wie soll das funktionieren, wenn b vorher keinen Wert besitzt? Der Debugger bemängelt, dass b nicht initalisiert wurde..

0
charles2520 
Beitragsersteller
 11.06.2015, 19:15
@charles2520

wenn vorher b mit 0 festgelegt wird, funktioniert es... warum auch immer^^

0