#define FMAX 20 #define BMAX 100 #include #include #include int Ofs; // Offset=Minwert Bereich int RecursionF;//Anzeige der Rekursivaufrufe int NoOutF; //Anzeige ohne Ergebnisausgabe long Counter; //-------------- void printout(char *s){ if(NoOutF)return; while (*s){ printf(" %d,",*s-'0'+Ofs); s++; } printf("\n"); Counter++; } //-------------- void listQCombis(int f,int q, int b, char *s){ int fr,qr,br; // Parameter für Rekursion int i; char buf[FMAX+1]; char *t; if(RecursionF) printf(" f:%d q:%d b:%d s:%s \n",f,q,b,s); for(i=0;i < b;i++){ t=stpcpy(buf,s); *t++ ='0'+i; //eintragen *t=0; if(i==q){ while(--f)*t++ ='0'; *t=0; printout(buf); return; } if(f==1) { //tiefste Rekursion erreicht if(i==q) printout(buf); } else{ qr=q-i; br=b; if(br > qr+1) br=qr+1; if(qr>0) listQCombis(f-1, qr, br, buf); // Rekursion } }// for i } //-------------- int main(int argc,char **argv){ int f,q,b; char *s; if (argc<5){printf("Zu wenig Parameter: 1.Anzahl Felder 2.Minwert 3.Maxwert 4.gewünschte Quersumme\n"); return 4;} f=strtol(argv[1],0,10); //Anzahl Felder Ofs=strtol(argv[2],0,10); // Min Wert b=strtol(argv[3],0,10)-Ofs+1; //Maxwert q=strtol(argv[4],0,10)-(Ofs*f); // gewünschte Quersumme if(f > FMAX){printf("Zuviele Felder\n");return 1;} if(b > BMAX){printf("Zu großer Zahlenbereich\n");return 2;} if(q > (b-1)*f){printf("Quersumme nicht erreichbar \n");return 3;} if(argc==6){ s=argv[5]; if(*s++=='r') RecursionF=1; //Anzeige der Rekursivaufrufe if(*s=='o') NoOutF=1; //Anzeige ohne Ergebnisausgabe } listQCombis(f, q, b, ""); printf("%lu Kombinationen gefunden \n",Counter); return 0; }