Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Pasar este miniprograma de c++ a c

Estas en el tema de Pasar este miniprograma de c++ a c en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 23/01/2012, 05:44
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 14 años, 3 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&lt;=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&lt;=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&lt;=aux;aux1*=i,i++);//factorial de aux1, que es la resta anterior<br />
                for(int i=1;i&lt;=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&lt;a.length;i++){ //recorreremos el arreglo donde guardamos los valores de las combinaciones por cada grupo.<br />
        for(int j=1;j&lt;=a[i];j++){//el numero de elementos a mostrar mientras no pasemos el limite<br />
         for(int k=1;k&lt;=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.

Etiquetas: funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:55.