C++ - Newbie braucht, hilft zum drucken von Kombinationen von zahlen
Glaube, ich bin da:
- Einem Bereich von Ganzzahlen
iRange
(z.B. von1
bis zuiRange
) und - Eine gewünschte Anzahl von Kombinationen
Möchte ich die Anzahl aller möglichen Kombinationen und drucken Sie all diese Kombinationen.
Beispiel:
Gegeben: iRange = 5
und n = 3
Dann die Anzahl der Kombinationen ist iRange! /((iRange!-n!)*n!) = 5! /(5-3)! * 3! = 10
Kombinationen, und die Ausgabe ist:
123 - 124 - 125 - 134 - 135 - 145 - 234 - 235 - 245 - 345
Anderes Beispiel:
Gegeben: iRange = 4
und n = 2
Dann die Anzahl der Kombinationen ist iRange! /((iRange!-n!)*n!) = 4! /(4-2)! * 2! = 6
Kombinationen, und die Ausgabe ist:
12 - 13 - 14 - 23 - 24 - 34
Mein Versuch so weit ist:
#include <iostream>
using namespace std;
int iRange= 0;
int iN=0;
int fact(int n)
{
if ( n<1)
return 1;
else
return fact(n-1)*n;
}
void print_combinations(int n, int iMxM)
{
int iBigSetFact=fact(iMxM);
int iDiffFact=fact(iMxM-n);
int iSmallSetFact=fact(n);
int iNoTotComb = (iBigSetFact/(iDiffFact*iSmallSetFact));
cout<<"The number of possible combinations is: "<<iNoTotComb<<endl;
cout<<" and these combinations are the following: "<<endl;
int i, j, k;
for (i = 0; i < iMxM - 1; i++)
{
for (j = i + 1; j < iMxM ; j++)
{
//for (k = j + 1; k < iMxM; k++)
cout<<i+1<<j+1<<endl;
}
}
}
int main()
{
cout<<"Please give the range (max) within which the combinations are to be found: "<<endl;
cin>>iRange;
cout<<"Please give the desired number of combinations: "<<endl;
cin>>iN;
print_combinations(iN,iRange);
return 0;
}
Mein problem:
Der Teil von meinem code für das drucken der Kombinationen funktioniert nur für n = 2, iRange = 4
und ich kann es nicht Arbeit im Allgemeinen, d.h., für jede n
und iRange
.
- Paar Punkte - bitte geben Sie Ihre Anfrage in der form einer Frage. Auch, denken Sie, was Sie gefragt haben. Ich glaube was du suchst ist eine permutation Algorithmus (iRange P n), die alle Kombinationen von n zahlen ausgewählt aus "iRange" Werte.
- In deinem Beispiel-Ausgabe:
123 - 124 - 125 - 134 - 135 - 142 - 145 - 234 - 245 - 345
Sie haben124
und142
, die aussieht wie eine permutation. Eine Kombination, die sollten Sie bekommen:123 - 124 - 125 - 134 - 135 - 145 - 234 - 235 - 245 - 345
. - was ich Frage ist für Hilfe/Ideen/Anleitungen zum ändern der for-Schleifen, so dass mein code funktioniert für alle Werte von n und iRange, und produzieren so eine Ausgabe wie in den Beispielen. Ich denke, dass vielleicht die for-Schleifen ersetzt werden sollte durch eine weitere rekursive Funktion, oder thansform die jetzige Funktion rekursiv ein. Aber ich kann mir nicht vorstellen base case für die reursion.
- DeSimone Dank, den ich gerade korrigiert es.
- Der erste Treffer für
next_combination
im Google ist ein anständiger Lesen: sites.google.com/site/hannuhelminen/next_combination - MANYYYYYYYY VIELEN DANK AN ALLE VON U!!!!!!! @aterrel & @Mike De Simone Ihre Antworten Gaben mir einen guten Einblick in den Algorithmus-design benötigt. @Alex & Harry Ihre Antworten Gaben mir schöne Lösungen zu meinem problem. @J. F. Sebastian vielen Dank, dass Sie mir Infos für weitere Lektüre. Ich bevorzuge harrys wegen der Einfachheit. Vielen Dank, alle wieder u
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist dein code bearbeitet werden 😀 😀 mit einem rekursive Lösung:
Ihre Lösung wird immer nur die Arbeit für n=2. Denken über die Verwendung eines Arrays (Kämme) mit n ints, dann wird die Schleife tick das Letzte Element im array. Wenn das Element erreicht max update dann Kamm[n-2] - Element und das Letzte Element zu dem vorherigen Wert +1.
Im Grunde wie eine Uhr funktioniert, aber Sie brauchen Logik, um zu finden, was zur Steigerung und was ist der nächste kleinste Wert ist.
Sieht aus wie ein gutes problem für Rekursion.
Definieren Sie eine Funktion
f(prefix, iMin, iMax, n)
, druckt alle Kombinationen vonn
Ziffern im Bereich [iMin
,iMax
] und gibt die gesamte Anzahl von Kombinationen. Fürn
= 1, es ausdrucken sollte jede Ziffer voniMin
zuiMax
und zurückiMax - iMin + 1
.Für Ihre
iRange = 5
undn = 3
Fall, rufen Sief("", 1, 5, 3)
. Die Ausgabe sollte123 - 124 - 125 - 134 - 135 - 145 - 234 - 235 - 245 - 345
.Beachten Sie, dass die erste Gruppe der Ausgänge sind einfach
1
vorangestellt, die auf die Ausgänge vonf("", 2, 5, 2)
, d.h.f("1", 2, 5, 2)
, gefolgt vonf("2", 3, 5, 2)
undf("3", 4, 5, 2)
. Sehen, wie Sie tun würden, die mit einer Schleife. Zwischen diesem, die Fall fürn
= 1 oben und fallen für schlechte Eingänge (am besten, wenn Sie nichts drucken und geben 0 zurück, sollte es vereinfachen, Ihre loop), sollten Sie in der Lage zu schreibenf()
.Bin ich kurz anhalten, weil das sieht aus wie eine Hausaufgabe. Ist das genug, um Sie zu erhalten begann?
EDIT: Nur für kichert, schrieb ich ein Python-version. Python hat eine einfachere Zeit werfen um Sätze und Listen von Dingen und bleiben lesbar.
Beachten Sie, dass
Combos()
kümmert sich nicht um die Typen der Elemente in deritems
Liste.Hier ist ein Beispiel eines einfachen rekursiven Lösung. Ich glaube, es existiert eine weitere optimale Umsetzung, wenn Sie ersetzen die Rekursion mit Zyklen. Es könnte sein, Sie Ihre Hausaufgaben 🙂
Dies ist mein C++ - Funktion mit unterschiedlichen Schnittstellen (basierend auf der sts::set), aber die gleiche Aufgabe durchführen: