/* Enumeration of k combinations on base set with n elements */ /* Elements are from 0 .. n-1 */ /* Ranks are from 0 .. C(n,k) - 1 */ #include int n,k,count; int C[20][20]; int cardCombset(n,k) int n,k; { int i,j,card; for (i=0;i<=n;i++) { C[i][0]=1; C[i][i]=1; } for (i=2;i<=n;i++) for (j=1;j=0;i--) { for (;leftover=n) { printf("bad input\n"); break; } } if (i==k) { for (i=0;i=comb[i+1]) break; if (i==k-1) break; printf("bad input\n"); } } } void printComb(comb) int comb[20]; { int i; for (i=0;i comb\n"); while (1) { printf("enter rank (-1 to terminate)\n"); scanf("%d",&rank); if (rank<(-1) || rank>=count) { printf("bad rank\n"); continue; } if (rank==(-1)) break; rank2comb(rank,comb); printComb(comb); } printf("comb -> rank\n"); while (1) { printf("wish to convert a case? (1=yes 0=no)\n"); scanf("%d",&i); if (i<0 || i>1) { printf("bad response\n"); continue; } if (!i) break; readComb(comb); printf("rank is %d\n",comb2rank(comb)); } printf("enumerate combinations starting from a rank\n"); while (1) { printf("enter rank & number of combinations (-1 -1 to stop)\n"); scanf("%d %d",&rank,&numCombs); if (rank==numCombs && rank==(-1)) break; if (rank<0 || rank>=count) { printf("bad rank\n"); continue; } if (numCombs<1 || rank+numCombs-1>=count) { printf("bad number of combinations\n"); continue; } rank2comb(rank,comb); printf("starting combination: "); combB=comb; combA=comb2; for (i=0;i