(1,2,3,4)
las combinaciones posibles entre ellos sin repetición alguna nos quedaría:
1,2,3,4, 12,13,14,23,24,34, 123,124,134,234, 1234
He encontrado uno pero estoy teniendo dificultad para adaptarlo a c.
Se divide en 2 partes:
Esta primera parte lo que hace es calcular el número de combinaciones que hay por cada grupo. Para nuestro ejemplo es: [4, 6, 4, 1]. Ya sabemos que en total hay 15 combinaciones.
Código:
La he adaptado de esta forma y funciona.double a[]=new double[tam];//declaramos nuestro arreglo y tamaño o<br /> //tam en este caso será 4.<br /> for(int m=1;m<=tam;m++){// por lo tanto haremos 4 veces<br /> double n=1;<br /> double r=1;<br /> double aux1=1;<br /> for(int i=1;i<=tam;n*=i,i++);//factorial de n que será el número de elementos.<br /> int aux=(tam-m);//restamos el tamaño menos el numero de elementos en el grupo<br /> for(int i=1;i<=aux;aux1*=i,i++);//factorial de aux1, que es la resta anterior<br /> for(int i=1;i<=m;r*=i,i++);//factorial del número de elementos por grupo<br /> a[m-1]=n/(aux1*r);//formula para obtener número de combinaciones posibles y lo guardamos en un arreglo.<br /> }<br />
Código:
int main() { int i; int j; int r; int zonas = 3; /* Array con el indice de cada packet */ int array[32] = {1,2,3,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0}; /* Se almacena el número de combinaciones de x elementos */ int guardar[32] = {0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0}; for (i = 1; i <= zonas; i++) { int n=1; int r=1; int aux1=1; for (j=1;j<=zonas;j++){n*=j;} int aux = zonas-i; for (j=1;j<=aux;j++){aux1*=j;} for (j=1;j<=i;j++){r*=j;} guardar[i-1] = n/(aux1*r); printf("Combinaciones de %d elementos: %d\n\n\n", i, guardar[i-1]); }
Ahora la segunda parte:
esta debe mostrar por pantalla las combinaciones
Código:
1<br /> int x=1;<br /> while(iter.hasNext()){//esto es por que yo tengo mis elementos en una lista y utilice un iterator para ir recorriendo toda la lista.<br /> for(int i=0;i<a.length;i++){ //recorreremos el arreglo donde guardamos los valores de las combinaciones por cada grupo.<br /> for(int j=1;j<=a[i];j++){//el numero de elementos a mostrar mientras no pasemos el limite<br /> for(int k=1;k<=x;k++){//para imprimirlos en grupos<br /> System.out.print(iter.next());//imprimimos<br /> }System.out.println();//salto de línea y cambio de grupo<br /> }x++;<br /> }<br /> }//end while<br />
2
3
4
12
13
14
23
24
34
123
124
134
234
1234
Pero soy incapaz de adaptarla porque yo no tengo una lista, sino en un array mis elementos. Y como veis, al empezar este hace un while de la lista que no entiendo para mi array.
Código:
int x=1; for (i=0; i < zonas;i++) { for (j=1; j<=guardar[i]; j++) { for (r=1; r <= x; r++) { printf("Aqui debe mostrar una combinacion\n"); } printf("\n"); } x++; }
Si podéis echarme una mano os lo agradecería.
Saludos.