Erschöpfendes Durchsuchen eines Abschnittes und Indexausgabe mit Summe = 0
-
Hallo,
Ich bin gerade daran, ein Programm zu schreiben, welches folgendes macht:
Man hat eine Folge aus n ganzen Zahlen vorgegeben (diese gibt man in meinem Fall nun manuell ein. Die Folge ist: 2, -2, 3, 4, -1, -5, 2, 3, 3, -6). Ausgegeben werden sollen alle zusammenhängenden Abschnitte, deren Summe = 0 ist, also z.B. 0, ..., 1, da 2+(-2) = 0 oder 3, ... 6, da 4+(-1)+(-5)+2 = 0.Nun hab ich folgenes Programmiert, aber mir wird immer nur 9, ..., 9 ausgegeben, was ja nicht so stimmt. Könnt ihr mir bitte helfen?
#include<stdio.h> enum{N=10}; typedef double Folge[N]; typedef struct { int i; int j; double summe; }Abschnitt; void sum(Folge x, int n, Abschnitt *abschnitt) { int akt_summe; /* Summe des betrachteten Abschnitts */ int i0, j0, k; abschnitt->i = 0; abschnitt->j = 0; abschnitt->summe = x[0]; /* alle moeglichen Abschnitte werden untersucht */ for(i0 = 0; i0 < n; i0++) for(j0 = i0; j0 < n; j0++) { akt_summe = x[i0]; for(k = i0 + 1; k <= j0; k++) akt_summe = akt_summe + x[k]; if(akt_summe == 0) { abschnitt->i = i0; abschnitt->j = j0; abschnitt->summe = akt_summe; } } } int main(void) { int n; /* Laenger der Folge */ Folge x; /* Zahlen der Folge */ Abschnitt abschnitt; int k; printf("Eingabe n (<= %d): ", N); scanf("%d", &n); for(k = 0; k < n; k++) { printf("Eingabe Folgenglied Nr. %d:", k); scanf("%d", &x[k]); } sum(x, n, &abschnitt); printf("Abschnitt: Indizes %d ... %d", abschnitt.i, abschnitt.j); return 0; }
Ich komme irgendwie gar nicht weiter und finde meinen Denkfehler nicht. Ich hoffe, ihr könnt mir helfen!
-
sehe ich das falsch oda ist da iwie ne schleife zu viel drin.
lg
der in den mai tanzte
-
...
-
Juli84 schrieb:
Ausgegeben werden sollen alle zusammenhängenden Abschnitte, deren Summe = 0 ist
Schade, falls man sie nur zählen muss gibt es Algorithmen die schneller sind als O(n2).
-
...
-
Swordfish schrieb:
Ja? Cool. Stichwort?
Keine Ahnung wie die heissen. Mir ist halt Ad Hoc einer eingefallen. Prefix-Sum ausrechnen und zählen wie oft jeder Wert vorkommt (sortieren und linear durchgehen z.B.). Wenn ein Wert c mal vorkommt, ergeben sich c*(c-1)/2 Abschnitte.