tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
3305
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sheester sheester ist offline Mitglied
    Registriert seit
    May 2007
    Beiträge
    14
    Hallo Leute,

    ich muss ein Programm erstellen, für welches ich alle Möglichen kombinationen der Zahlen 0-9 benötige.
    Keine Zahl soll doppelt Vorkommen.
    Die Funktion Permutation soll einmal aufgerufen werden können und dann verändertaust sie genau 2 Zahlen in meinem String. Um also alle Kombinationen von 0-9 zu erhalten, muss Permutation 3628800mal aufgerufen werden.

    Ich hab mich schon über Permutation bei Google schlau gemacht, jedoch komme ich da der Lösung meines Problems nicht näher.

    Ich hoffe ihr könnt mir helfen, steh momentan echt auf dem Schlauch.

    Grüsse
     

  2. #2
    Avatar von devDevil
    devDevil devDevil ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Beiträge
    662
    Ehm das ist natürlich krank Aber am einfachsten geht es durch:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    unsigned char[3628800][10];
     
    for (unsigned int i(0); i < 10; ++i)
        for (unsigned int j(0); j < 10; ++j)
            for (unsigned int k(0); k < 10; ++k)
                for (unsigned int l(0); l < 10; ++l)
                    for (unsigned int m(0); m < 10; ++m)
                        for (unsigned int n(0); n < 10; ++n)
                            for (unsigned int o(0); o < 10; ++o)
                                for (unsigned int p(0); p < 10; ++p)
                                    for (unsigned int q(0); q < 10; ++q)
                                        for (unsigned int r(0); r < 10; ++r)
                                            std::cout << i << j << k  << l << m << n << o << p << q << r << "\n";
    aber das std::cout ist sehr langsam ... vllt hier auf C zurück greifen ... oder sogar auf putchar und selbst + '0' zu i usw. addieren um das richtige Zeichen zu bekommen ...
    Code cpp:
    1
    
    std::putchar(i + '0');
    ...
    Geändert von devDevil (17.05.08 um 18:21 Uhr)
     

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    schau mal hier:
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    /* 
     * File:   Main.c
     * Author: Tom
     *
     */
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void swap(char *c, int firstIndex, int secondIndex);
    void permut(char *c, int endIndex);
     
    int main(int argc, char** argv) {
        char c[20];
        printf("Chars: ");
        scanf("%s",&c);
        fflush(stdin);
        permut(c,strlen(c)-1);
        return (EXIT_SUCCESS);
    }
     
    void swap(char *c, int firstIndex, int secondIndex){
        char tmp = c[firstIndex];
        c[firstIndex] = c[secondIndex];
        c[secondIndex] = tmp;
    }
     
    void permut(char *c, int endIndex){
        if(endIndex == 0){
           printf("%s\n",c);
        }else{
           permut(c,endIndex-1);
           int i;
           for(i = 0; i<endIndex;i++){
               swap(c,i,endIndex);
               permut(c,endIndex-1);
               swap(c,i,endIndex);
           }
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    Chars: ABC
    ABC
    BAC
    CBA
    BCA
    ACB
    CAB
    [Press Enter to close window]

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    Avatar von devDevil
    devDevil devDevil ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Beiträge
    662
    Rekursiv ist eigtl. langsamer als Iterativ.
     

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    1) Ich habe nur einen anderen Algorithmus vorgestellt der etwas flexibler ist, als das was du da vorgeschlagen hast.
    2) Rekursion ist nicht immer langsamer als Iteration! Jeder Funktionsaufruf kostet Zeit und Speicher das ist klar, jedoch besiegt eine clervere rekursive Implementierung oftmals eine umständliche iterative.
    Weiterhin lässt sich der Nachteil des erhöhten Speicherplatzbedarfs mit Techniken wie Endrekursion / tailcalls: http://de.wikipedia.org/wiki/Endrekursion relativ einfach aus der Welt schaffen , sofern die Sprache / der Compiler sowas unterstützt.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  6. #6
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,

    @devDevil

    mal abgesehen davon, ist dein Algorithmus auch noch falsch ...
    1.) Hast du lauter Endlosschleifen drin
    2.) Ist eine Permutation nur auf Mengen definiert, d.h. die Elemente müssen alle verschieden sein. => die Permutationsmenge einer Menge mit n Elementen besitzt n! Elemente. Deine "Menge" hat aber lauter Duplikate und besitzt folglich n^n Elemente, wenn du denn diese Endlosschleifen beseitigen würdest.

    Gruß,
    RedWing
     
    "I'm not deaf, I'm ignoring you"
    ----

  7. #7
    Avatar von devDevil
    devDevil devDevil ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Beiträge
    662
    Ich sag ja nix dagegen das du einen anderen Lösungsvorschlag anbringst Hab die jetzt auch keinem Performancetest unterzogen :-P

    @RedWing:
    (1) Jop. Passiert wenn man es nur so reintippt.
    (2) Wer hat von Permutation gesprochen? Er wollte nur alle möglichen Kombinationen ohne das 121 z.B. doppelt vorkommt. Das ist so der Fall.
     

  8. #8
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,
    Zitat Zitat von devDevil Beitrag anzeigen

    @RedWing:
    (2) Wer hat von Permutation gesprochen? Er wollte nur alle möglichen Kombinationen ohne das 121 z.B. doppelt vorkommt. Das ist so der Fall.
    naja, seine Aufgabenstellung impliziert das ja (bzw erschlägt einen der Zaunpfeiler fast ):
    Die Funktion Permutation soll einmal aufgerufen werden können und dann verändertaust sie genau 2 Zahlen in meinem String. Um also alle Kombinationen von 0-9 zu erhalten, muss Permutation 3628800mal aufgerufen werden.
    M = {0,...,9} => |M| = 10 => |P(M)| = 10! = 3628800

    (1) Jop. Passiert wenn man es nur so reintippt.
    Es sei dir verziehen :P

    Gruß,
    RedWing
     
    "I'm not deaf, I'm ignoring you"
    ----

  9. #9
    Avatar von devDevil
    devDevil devDevil ist offline Mitglied Platin
    Registriert seit
    Jun 2005
    Beiträge
    662
    Aua Jetzt is et mir aber peinlich Hab die Aufgabe scheinbar nicht zu ende gelesen denn den Teil mit Permutation hatte ich vorher noch nicht gelesen Sorry ... habt ja recht
     

  10. #10
    gulaschsuppe Tutorials.de Gastzugang
    und auf welchem rechner soll das laufen?
    gibt es online server, die das ergebnis als txt. datei ausgeben? das würde mich dehr interessieren
    also
    0000000000000
    0000000000001
    0000000000002
    in txt. datei
    vielen dank im vorraus
     

  11. #11
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.800
    Blog-Einträge
    5
    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    und auf welchem rechner soll das laufen?
    Auf einem Recher, für den es einen C-Compiler gibt.


    Zitat Zitat von gulaschsuppe Beitrag anzeigen
    gibt es online server, die das ergebnis als txt. datei ausgeben? das würde mich dehr interessieren
    also
    0000000000000
    0000000000001
    0000000000002
    in txt. datei
    vielen dank im vorraus
    Ist nicht auszuschließen. Allerdings beschreibst du mit deiner Reihe keine Permutationen. Wofür brauchst du eine solche Datei?

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

Ähnliche Themen

  1. Permutation eines Arrays
    Von 'GreenDragon' im Forum PHP
    Antworten: 1
    Letzter Beitrag: 04.10.10, 09:27
  2. Permutation erzeugen
    Von Thomas Darimont im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 0
    Letzter Beitrag: 26.06.10, 11:59
  3. Permutation
    Von om1krnoy im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 17.05.10, 20:33
  4. Antworten: 10
    Letzter Beitrag: 06.03.10, 20:51
  5. Permutation (kombinationen anzeigen)
    Von hemorieder im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 05.04.06, 11:57