Permutation von 1,2,3,4.. n natürlichen Zahlen
-
Schreiben Sie ein Programm, welches eine Folge p von n natürlichen Zahlen einliest und, falls es sich dabei um eine Permutation der natürlichen Zahlen 1, 2, ..., n handelt, prüft, ob die Permutation gerade oder ungerade ist.
Anmerkung: Steht in einer Permutation eine größere Zahl vor einer kleineren, so liegt eine "Inversion" dieser beiden Zahlen vor. Ist die Anzahl der Inversionen gerade, so heißt auch die Permutation gerade, entsprechend bei ungerader Anzahl von Inversionen.
Beispiel:
Eingabe: 1 2 6 3 4
Keine Permutation
Programm wiederholen(j/n)?Einabe: 2 4 1 3
Ungerade Permutation
Programm wiederholen(j/n)?Eingabe: 4 1 3 2
Gerade Permutation
Programm wiederholen(j/n)?Eingabe: 3 5 2 1
Keine Permutation
Pogramm wiederholen (j/n)?Hallo, Leute ich bin gerade am herumtüffteln dieser Aufgabenstellung, jedoch mach ich irgendetwas falsch und komme nicht weiter vielleicht könnte ja jemand einen Blick drüberwerfen und schauen was da falsch ist. PS: ich bekomm das mit den einlesen von n natürlichen Zahlen nicht hin deswegen Konstante mit ANZAHL 5 und ich hab so garkeinen Plan wie ich das schaffe überhaupt eine Permutation zubestimmen also:
Eingabe: 3 5 2 1
Keine Permutation
Pogramm wiederholen (j/n)?Danke schon mal im vorraus
#define ANZAHL 5 void ausgabe(const int array[], int laenge, int stellen); int inversion(int *werte, int len); int main(void){ //Variablendeklaration int feld[ANZAHL]; int i; int n; int ergebnis = 2; for (i = 0; i<ANZAHL; i++) { printf("Zahl: "); fgets(feld, sizeof(feld), stdin); zahl = strtol(feld, &eptr, 10); } n = sizeof(feld) / sizeof(feld[0]); printf("das feld lautet:"); ausgabe(feld, n, 4); putchar('\n'); inversion(feld, n); return EXIT_SUCCESS; } void ausgabe(const int array[], int n, int breite){ int i; for (i = 0; i<n; i++) printf("%*d", breite, array[i]); } int inversion(int *werte, int len){ /* len ist die Länge des Arrays, wo man die Werte eingegeben hat */ int j = 0, k = 0, count = 0; for (j = 0; j<len; j++) for (k = j+1; k<len; k++) if (werte[j]>werte[k]) count++; /* count wird stets erhöht, wenn*/ printf("es musste %d mal getauscht werden!!\n", count); //ein Element im Array > als einer der nachfolgenden ist if ((count % 2) == 0) printf("es liegt eine gerade permutation vor!\n\n"); else printf("es liegt eine ungerade permutation vor!\n\n"); return 0; }
-
fgets(feld, sizeof(feld), stdin); zahl = strtol(feld, &eptr, 10);
Das wirkt ziemlich gekünstelt.
Für sowas nimmt man besser scanfif( 1==scanf("%d",&feld[i]) ) printf("Eingabe OK: %d",feld[i]);
n = sizeof(feld) / sizeof(feld[0]);
n wird immer ANZAHL liefern, weil feld eine konstante Größe besitzt.