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 scanf

    if( 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.


Anmelden zum Antworten