Permutationen in C einzeln ausgeben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Permutationen in C einzeln ausgeben

    Hallo erstmal,

    ich habe ein Problem bezüglich Permutationen. Ich will in einem C-Programm alle möglichen Zahlenkombinationen von 1-n ausgeben, wobei die Reihe immer n lang sein muss und jede Ziffer nur einmal vorkommen darf, also 1 2 3 4 5, 1 3 2 4 5, 1 3 2 5 4 usw.
    Ich habe schon einige Lösungen gefunden, bei denen alle Permutationen direkt in einer Funktion ausgegeben werden. Ich würde es aber gerne schaffen, dass die Permutationen alle einzeln nacheinander realisiert werden können, sodass man dazwischen auch noch andere Sachen damit anstellen kann.
    Das Ausgeben aller Permutationen soll dann nur über einen Funktionsaufruf in einer while-Schleife möglich sein. Momentan habe ich leider das Problem, dass die Permutationen über meinen Lösungsweg teilweise doppelt ausgegeben werden, da ich da falsch vertausche. Ich finde aber einfach keine Lösung, wie ich den Algorithmus entsprechend umbiegen kann. Also bei n = 3 funktioniert meine Lösung, bei höheren n werden aber eben Werte doppelt ausgegeben. Hat jemand einen Tipp für mich?

    Quellcode

    1. #include <stdio.h>
    2. int fak(int n)
    3. {
    4. if(n == 0 || n == 1)
    5. {
    6. return 1;
    7. }
    8. else
    9. {
    10. return fak(n - 1) * n;
    11. }
    12. }
    13. void vertausche(int *r_pointer, int n, int offset)
    14. {
    15. int tmp = *(r_pointer + n - 1);
    16. *(r_pointer + n - 1) = *(r_pointer + offset - 1);
    17. *(r_pointer + offset - 1) = tmp;
    18. }
    19. void drucke_reihe(int *r_pointer, int n)
    20. {
    21. int i;
    22. for(i = 0; i < n; i++)
    23. {
    24. printf("%d ", *(r_pointer + i));
    25. }
    26. printf("\n");
    27. }
    28. void initiiere_reihe(int *r_pointer, int *f_pointer, int n)
    29. {
    30. int i;
    31. for(i = 0; i < n; i++)
    32. {
    33. *(r_pointer + i) = i + 1;
    34. *(f_pointer + i) = fak(i);
    35. }
    36. drucke_reihe(r_pointer, n);
    37. }
    38. void erzeuge_neue_reihe(int *r_pointer, int *f_pointer, int *anzahl, int n)
    39. {
    40. int c = 1;
    41. while(c < n)
    42. {
    43. if(*anzahl % *(f_pointer + (n - c)))
    44. {
    45. c++;
    46. }
    47. else
    48. {
    49. vertausche(r_pointer, n, n - (n - c));
    50. break;
    51. }
    52. }
    53. *anzahl = *anzahl + 1;
    54. drucke_reihe(r_pointer, n);
    55. }
    56. int main(void)
    57. {
    58. int n = 4;
    59. int anzahl = 1;
    60. int fakultaeten[n];
    61. int reihe[n];
    62. initiiere_reihe(reihe, fakultaeten, n);
    63. while(anzahl < fak(n))
    64. {
    65. erzeuge_neue_reihe(reihe, fakultaeten, &anzahl, n);
    66. }
    67. printf("\nInsgesamt %d Reihen.\n", anzahl);
    68. return 0;
    69. }
    Alles anzeigen


    Vielen Dank schonmal! :)
    Schauen Sie doch mal bei meinem Blog vorbei!

    Außerdem biete ich Webdesign inklusive Suchmaschinenoptimierung unter Leaves-Webdesign.de an.