
23/01/2012, 05:44
|
| | Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 14 años, 8 meses Puntos: 0 | |
Pasar este miniprograma de c++ a c Hola, pretendo encontrar un algoritmo que dado un array de enteros te calcule todas las combinaciones entre elementos.
(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:
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 />
La he adaptado de esta forma y funciona.
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:
<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 />
1
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. |