c++ Aufgabenstellung

Gast #6959573
Lesenswert?

Hi

ich möchte von den 10 Zahlen zwischen 1 bis 10 jede mögliche Anordnung 
erhalten.
ich denk schon die ganze Nacht drüber nach, wie man das Problem in C++ 
lösen könnte, aber alle meine Ideen sind äußerst kompliziert und 
umständlich. Ich bin relativ sicher, dass die Aufgabe relativ einfach zu 
lösen wäre.

Hat jemand eine Idee?
Gast #6959596
Lesenswert?

Mr. Thyristor schrieb:
> Hi
>
> ich möchte von den 10 Zahlen zwischen 1 bis 10 jede mögliche Anordnung
> erhalten.
> ich denk schon die ganze Nacht drüber nach, wie man das Problem in C++
> lösen könnte, aber alle meine Ideen sind äußerst kompliziert und
> umständlich. Ich bin relativ sicher, dass die Aufgabe relativ einfach zu
> lösen wäre.
>
> Hat jemand eine Idee?

10^10-1

Die erste 10 enthält alle möglichen zulässigen Zeichen, also 1 bis 10.
Und die zweite 10 im Exponenten enthält die Länge der Ausgabe.

Im Prinzip ist das wie bei Binärzahlen, wenn man bspw. sagt 2^8-1, was 
für 2 Möglichkeiten also 0 oder 1 und der Länge 8 steht.
Fängt man mit 1 zu zählen an und hört bei 2^8-1, also 255 auf, dann hat 
man alle Kombinationen.

Die 0 hast du nicht drin, du kannst mit ihr aber rechnen und müsstest 
sie dann lediglich in der Ausgabe durch eine 10 ersetzen.

Um alle Kombinationen zu haben müsstest du somit nur von 1 bis 10^10-1 
hochzählen und alle Nullen durch eine 10 ersetzen.
#6959635
Lesenswert?

Nano schrieb:
> 10^10-1

Nein, es ist 10!, zumindest wenn mit "von den Zahlen … jede mögliche 
Anordnung" Permutationen ohne Wiederholung gemeint sind.

Mr. Thyristor schrieb:
> ich denk schon die ganze Nacht drüber nach, wie man das Problem in C++
> lösen könnte, aber alle meine Ideen sind äußerst kompliziert und
> umständlich.

Dann erzähl doch mal, wie du vorgehen würdest.

> Ich bin relativ sicher, dass die Aufgabe relativ einfach zu
> lösen wäre.

Ist sie. Aber du musst schon selbst deine Ideen zeigen, und dann kann 
man diskutieren, was da besser gemacht werden kann.
#6959817
Lesenswert?

Dirk B. schrieb:
> Ist das nicht die Menge der Natürlichen Zahlen (mit 0)?

Wie meinen?
Vielleicht mal, wie ich die Aufgabe verstehe: Man stelle sich vor, der 
Herr Thyristor hat 10 Zettel, und auf jedem steht eine Zahl. Die legt er 
jetzt in einer Reihe nebeneinander auf den Tisch. Nun will er alle 
Reihenfolgen dieser 10 Zahlen haben, die möglich sind (sprich: alle 
Permutationen).
Gast #6960081
Lesenswert?

Rolf M. schrieb:
> Dann erzähl doch mal, wie du vorgehen würdest.

Ich habe 9 verschachtelte for Schleifen (0-9) gemacht, und in jeder vor 
Ausgabe der Nummer überprüft, ob die Nummer schon in den vorherigen 
Schleifen vorkommt.
D.h. DIe zweite Schleife hat alle Zahlen 0-9 augegeben, bis auf der von 
Schleife 1. Schleife 3 alle Zahlen 0-9 außer den beiden von Schleife 1 
und Schleife 2 usw.

Die letze (zehnte) Zahl hab ich nur noch per Abfrage bestimmt, d.h. die 
Zahl 0-9, die noch nicht in den vorherigen Schleifen vorgekommen ist


Aber wie erwähnt, die Vorgangsweise habe ich für umständlich gehalten 
und war mir eigentlich sicher, es gibt einen einfacheren und vielleicht 
trivialen Weg...
Gast #6960092
Lesenswert?

> es gibt einen einfacheren und vielleicht trivialen Weg

Mathematiker behaupten, das trivialste sei eine rekursive Funktion. Alle 
anderen Menschen sind der Ansicht, 9 ineinander geschachtelte Schleifen 
sind das einfachste.

So was in der Art: Pseudocode
[code]
funktion AlleAusgeben(List alleZahlen) {
  if (alleZahlen is Empty) {
    print (newline)
  for(zahl in alleZahlen) {
    print (zahl)
    restZahlen = alleZahlen - zahl
    AlleAusgeben(restZahlen)
  }
}

AlleAusgeben([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
[/code
Gast #6960154
Lesenswert?

Rolf M. schrieb:
> Nano schrieb:
>> 10^10-1
>
> Nein, es ist 10!, zumindest wenn mit "von den Zahlen … jede mögliche
> Anordnung" Permutationen ohne Wiederholung gemeint sind.

Ohne Wiederholung hat er nicht gefordert.
Wenn jede mögliche Anordnung gemeint ist, dann müssen da auch die 
Wiederholungen mit dabei sein.

Bsp. für jede mögliche Anordnung der Ziffern 0 bis 1 bei 3 Stellen 
ergibt:
1
000
2
001 **
3
010
4
011
5
100
6
101
7
110
8
111

** Schon hier kannst du die 2 führenden Nullen nicht einfach weglassen, 
weil die zuvor schon vorkamen. Also ist es mit Wiederholung.
Gast #6960158
Lesenswert?

Rolf M. schrieb:
> Vielleicht mal, wie ich die Aufgabe verstehe: Man stelle sich vor, der
> Herr Thyristor hat 10 Zettel, und auf jedem steht eine Zahl. Die legt er
> jetzt in einer Reihe nebeneinander auf den Tisch. Nun will er alle
> Reihenfolgen dieser 10 Zahlen haben, die möglich sind (sprich: alle
> Permutationen).

Ja, in dem Fall hättest du recht, aber diese Anforderung ergibt sich 
nicht aus seiner Threadfrage.
Da sollte er also noch einmal Klarheit schaffen.

Aus meiner Sicht meint er jede mögliche Kombination aus den Ziffern 1 
bis 10, wobei die auch mehrfach vorkommen dürfen.
#6960178
Lesenswert?

Nano schrieb:
> Aus meiner Sicht meint er jede mögliche Kombination aus den Ziffern 1
> bis 10, wobei die auch mehrfach vorkommen dürfen.

Da wäre es wichtig, wieviel Stellen es geben soll

Der TO schrieb auch von Zahlen und nicht von Ziffern (10 hat zwei 
Ziffern)
Und zwischen 1 bis 10 (ist das 2 bis 9?)

> Da sollte er also noch einmal Klarheit schaffen.

unbedingt.
#6960237
Lesenswert?

Mr. Thyristor schrieb:
> Ich habe 9 verschachtelte for Schleifen (0-9) gemacht, und in jeder vor
> Ausgabe der Nummer überprüft, ob die Nummer schon in den vorherigen
> Schleifen vorkommt.

Das ist algorithmisch die naheliegendste Variante.

Noch ein Kommentar schrieb:
> Mathematiker behaupten, das trivialste sei eine rekursive Funktion.

Ich bin kein Mathematiker, aber Rekursion würde ich auch in Betracht 
ziehen. Ob das jetzt eleganter oder trivialer ist, sei mal 
dahingestellt.

Nano schrieb:
> Rolf M. schrieb:
>> Nano schrieb:
>>> 10^10-1
>>
>> Nein, es ist 10!, zumindest wenn mit "von den Zahlen … jede mögliche
>> Anordnung" Permutationen ohne Wiederholung gemeint sind.
>
> Ohne Wiederholung hat er nicht gefordert.

Deswegen ja "zumindest wenn…".

> Wenn jede mögliche Anordnung gemeint ist, dann müssen da auch die
> Wiederholungen mit dabei sein.

Dann kommen aber nicht mehr unbedingt alle Zahlen von 1 bis 10 drin vor. 
Gut, stand da nicht explizit, aber so hatte ich es verstanden, und ich 
hatte wohl Recht, wie der Ansatz zeigt:

Mr. Thyristor schrieb:
> Ich habe 9 verschachtelte for Schleifen (0-9) gemacht, und in jeder vor
> Ausgabe der Nummer überprüft, ob die Nummer schon in den vorherigen
> Schleifen vorkommt.

Dirk B. schrieb:
> Nano schrieb:
>> Aus meiner Sicht meint er jede mögliche Kombination aus den Ziffern 1
>> bis 10, wobei die auch mehrfach vorkommen dürfen.
>
> Da wäre es wichtig, wieviel Stellen es geben soll

Richtig. Wenn man es so interpretieren würde, wäre unklar, wie lang die 
Reihe sein soll. Wenn jede genau einmal vorkommen muss, ergibt sich 
automatisch, dass es 10 sind. Deshalb hatte ich das auch so 
interpretiert.
Gast #6960574
Lesenswert?

> Hausaufgaben selber machen.

Nö. Soweit ich es überblicke geht es hier um etwas ganz anderes.

Mr. Thyristor dachte sich seine Lösung selbst aus und kam zu dem Gefühl, 
das müsse wohl einfacher gehen.

Stimmt. Mr. Thyristor hat das richtige Bauchgefühl für einen Entwickler.
 In der STL finden sich passende Templatemethoden.
 Und es gibt einen prähistorischen Standard Algorithmus, der mit 10-15 
Zeilen auskommt.

Der Tipp wäre eher: Arbeite ein Lehrbuch zu Datenstrukturen und 
Algorithmen durch. Niklaus Wirth oder so etwas in der Art. Gibt es da 
was moderneres?
Gast #6961256
Lesenswert?

Zum Programmieren ist die Rekursion wohl die einfachste Methode:

- Für nur zwei Zahlen ist die Permutation triv.
- Für n+1 Zahlen setzt man die (n+1)-te Zahl auf 1 und spielt dann alle 
Permutationen der verbleibenden n Zahlen durch, Dann setzt man die 
(n+1)-te Zahl auf 2 und spielt wieder alle anderen durch, usw.

Ob das effizient, klein und schnell ist, ist nochmal eine andere Frage.
Gast #6961273
Lesenswert?

For i = 1000000000 to 10000000000
 ' erstellt jede Mögliche 10 Stellige Zahl
 ' i in string um wandeln.
 ' nach doppelten ziffern suchen (Instr.-Funktion)
 ' wenn nicht ausgeben.
next i

Fertig.

Man wie kann man aus einer einfach Zählerei so eine Wissenschaft machen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren