Algorithmus für die Generierung von Zahl-Kombinationen ohne Wiederholung
Habe ich überprüft, fast alle ähnlichen Beitrag hier, aber ich konnte nicht herausfinden, wie ich das tun kann, was ich will. Was ich versuche zu geben, ist eine Eingabe in ein C-Programm, sagen wir der Nummer 4, und das Programm zurückgeben die folgenden zahlen in einem array:
1
2
3
4
12
13
14
23
24
34
123
134
124
1234
Um deutlicher zu sein:
Wenn die Eingabe-Zahl 4, dann will ich mit Ziffern 1-4 und generieren alle möglichen Kombinationen von Ziffern(von 1-stellige Kombinationen zu 4-stellige Kombinationen) ohne Ziffer Wiederholungen.
Habe ich versucht den folgenden code:
#include <stdio.h>
/* Prints out a combination like {1, 2} */
void printc(int comb[], int k) {
printf("{");
int i;
for (i = 0; i < k; ++i)
printf("%d, ", comb[i] + 1);
printf("\\b\\b}\\n");
}
int next_comb(int comb[], int k, int n) {
int i = k - 1;
++comb[i];
while ((i >= 0) && (comb[i] >= n - k + 1 + i)) {
--i;
++comb[i];
}
if (comb[0] > n - k) /* Combination (n-k, n-k+1, ..., n) reached */
return 0; /* No more combinations can be generated */
/* comb now looks like (..., x, n, n, n, ..., n).
Turn it into (..., x, x + 1, x + 2, ...) */
for (i = i + 1; i < k; ++i)
comb[i] = comb[i - 1] + 1;
return 1;
}
int main(int argc, char *argv[]) {
int n = 5; /* The size of the set; for {1, 2, 3, 4} it's 4 */
int k = 3; /* The size of the subsets; for {1, 2}, {1, 3}, ... it's 2 */
int comb[16]; /* comb[i] is the index of the i-th element in the
combination */
/* Setup comb for the initial combination */
int i;
for (i = 0; i < k; ++i)
comb[i] = i;
/* Print the first combination */
printc(comb, k);
/* Generate and print all the other combinations */
while (next_comb(comb, k, n))
printc(comb, k);
return 0;
}
Dem oben genannten Programm druckt das Ergebnis. Ich möchte das Ergebnis irgendwie.. aber ich kann nicht, weil der obige code druckt das Ergebnis in eine seltsame Art und Weise.
Sie werden versuchen zu zeigen, eine Art der permutation der ursprünglichen Eingabe? Deine Frage ist nicht sehr klar.
Ich reparierte die Ausgabe, und ich habe eine bessere Erklärung
Ah, du bist also versucht zu ändern das Programm, das Sie gefunden auf compprog.wordpress.com/2007/10/17/generating-combinations-1, um seine Ausgabe in ein array statt stdout?
Das ist richtig.Und das ist, weil ich versuchte alles, was ich denken konnte..
InformationsquelleAutor Dchris | 2013-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden wir int, um sind. Für das i-te bit, falls es 1 ist, dann habe ich in dem Satz enthalten ist und Umgekehrt.
Nehmen ein Beispiel:1010(2)={4,2} 1111(2)={4,3,2,1}
Für jedes element, das betrachtet werden wird, gibt es zwei Möglichkeiten: in oder nicht in der Menge.
Es gibt also 2^n anderen Satz insgesamt. Und in meinem code, die ich nur aufzählen von allen möglichen int die entsprechenden set-und-Ausgabe das entsprechende set.
So bekommen wir diesen code:
wenn n=4, Ausgabe:
Wenn Sie möchten, um die Ausgabe der Antwort als den Auftrag zu geben, nur damit Sie string und setzen Sie diese Zeichenfolge in Vektor-und Sortieren.
Wenn n groß ist, die Sie verwenden können, bitset. Aber wenn n>30,es kann nicht sein, der endet in Stunden. Also int ist effizient.
(sizeof(int)*8)-2
, und Sie konnte Extraspitze aus, wenn Sie verwendet werdenunsigned int
. Wenn größere Formate benötigt wurden, um ein byte-array mit einem zusätzlichen loop, könnte leicht integriert werden. Alles in allem eine nette Antwort.Ich denke, dass das hinzufügen einer Beschreibung an der Spitze, warum der Algorithmus funktioniert, wäre nett. Dieser Algorithmus erzeugt die (ungeordnete) setzt und darstellt Sie mit einem Satz von bits. So
{1, 2, 3, 4} = 1111
und{} = 0000
und{1, 3} = 1010
usw. Es geht durch alle bit-Sätze und erzeugt die entsprechenden zahlen setzt, indem überprüft wird, ob das bit auf "ein" (d.h.== 1
) und druckt es, wenn das der Fall ist. Ah ich habe gerade bemerkt Sie nicht, drucken Sie die leere Menge, aber das kann oder kann nicht wünschenswert sein.Ah, ich geschraubt bis die Bestellung. Es ist mehr wie
{4, 3, 2, 1} = 1111
(statt{1, 2, 3, 4} = 1111
)Ich update meine Antwort. Vielen Dank für Ihre Beratung.
InformationsquelleAutor Sayakiss
Hier wird ein Programm erzeugt, dass Kombinationen von zahlen. Es ist in C geschrieben.
Aber es könnte sein, umgeschrieben, in eine andere Sprache. Für jetzt, kompilieren Sie es und versuchen Sie es !
führen Sie für n=4 :
InformationsquelleAutor Mustapha Oldache