Forum: PC-Programmierung c++ Aufgabenstellung


von Mr. Thyristor (Gast)


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?

: Verschoben durch Moderator
von nfet (Gast)


Lesenswert?

while(true) cout << rand() << rand() << rand();

von Gästin (Gast)


Lesenswert?


von Nano (Gast)


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.

von Nano (Gast)


Lesenswert?

Zu beachten ist noch, dass du natürlich führende Nullen, die beim 
hochzählen nicht dabei sein werden, selber dranhängen und durch eine 10 
ersetzen musst.

von Rolf M. (rmagnus)


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.

von Dirk B. (dirkb2)


Lesenswert?

Ist das nicht die Menge der Natürlichen Zahlen (mit 0)?

von Rolf M. (rmagnus)


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).

von Dirk B. (dirkb2)


Lesenswert?

Danke für die Aufklärung.

von Oliver S. (oliverso)


Lesenswert?

Mr. Thyristor schrieb:
> aber alle meine Ideen sind äußerst kompliziert und
> umständlich.

Dann zeig doch mal deine Ideen als Code.

Oliver

von Noch ein Kommentar (Gast)


Lesenswert?

Als es noch nicht für jedes Problem eine passende Komponente gab, hatten 
die Leute alle Permutationen mit dem Backtracking Algorithmus erzeugt.

von Oliver S. (oliverso)


Lesenswert?

Mr. Thyristor schrieb:
> Hi
>
> ich möchte von den 10 Zahlen zwischen 1 bis 10 jede mögliche Anordnung
> erhalten.

Nachtrag: die Aufgabenstellung solltest du wenigstens richtig 
abschreiben, denn so, wie du das geschrieben hast, wird die wohl nicht 
lauten.

Oliver

von Mr. Thyristor (Gast)


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

von Noch ein Kommentar (Gast)


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

von Nano (Gast)


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.

von Nano (Gast)


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.

von Dirk B. (dirkb2)


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.

von Rolf M. (rmagnus)


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.

von Alonzo Mutex (Gast)


Lesenswert?

Mr. Thyristor schrieb:
> Hat jemand eine Idee?
Hausaufgaben selber machen.

von Noch ein Kommentar (Gast)


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?

von Vancouver (Gast)


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.

von Schlaumaier (Gast)


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.

von Justus (Gast)


Lesenswert?

Schlaumaier schrieb:
> Man wie kann man aus einer einfach Zählerei so eine Wissenschaft machen.
So ganz einfach ist es dann nicht. Es geht nicht "0..9", sondern 
"1..10". 10x die Zahl 10 ergibt eine 20-stellige Zahl:
10101010101010101010

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.