Hallo Rainer,
ich habe den Code in eine C++ Klasse umgeschrieben. Ich poste mal die ganze Klasse.
Gruß Kurt
----- Code-----
#include
typedef unsigned int uint; //Typendefinition
// Hilfsfunktionen im alten C Stil
double logfak(uint n); // Fakultät
uint binomial(uint n,uint r); //Binomialkoeffizient
/* Hauptklasse
Algorithmus zur Aufzählung alle Kombinationen von k aus n Elementen [C(n,k)]
*/
class kombi {
public:
kombi(uint,uint); // Constructer
~kombi(); // Destructor
uint n; //n
uint k; //k
uint komb; // Anzahl der Kombinationen
uint* E; // Zeiger auf Ausgabe-Array
private:
uint z; // Zähler
uint temp; // temporäre Variable
uint* A; // * zeiger auf Hilfs-Array
void algo(uint,uint); //Hauptroutine
};
kombi::kombi(uint n, uint k)
{
uint N_;
uint K_;
z=0;
N_ = n; // N
K_ = k; // n
temp = K_; // temporäre Datei wird mit k gesetzt
A = new uint [N_] ; // Arraygröße
komb = binomial(N_, K_); //maximale Kombinationen
// Erstellung des dynamischen Ausgabearrays
E = new uint [komb*temp]; // Arraygröße
algo(N_, temp); // Start
delete [] A; // Speicher freigeben
delete [] E; // Speicher freigeben
}
kombi::~kombi()
{
}
void kombi::algo(uint n, uint kk)
{
//Vervollständigung aller Komb. ohne N
if (n > kk)
algo(n - 1, kk);
// kombinationen mit N
if (n >= kk–)
{
A[kk] = n;
if (kk > 0)
//Zwischensppeichern von N
algo(n - 1, kk);
else
{
// Ausgabe
for (uint j = 0; j r)
{
bin = logfak(n) - logfak® - logfak(n - r);
}
bin=exp(bin);
return (uint)bin;
}
double logfak(uint n)
{
double logfak = 0;
for (int unsigned i = 0; i