Advertisement
rohan_

(vectores dinamicos) collar de perlas

Nov 4th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.15 KB | None | 0 0
  1. /*
  2. autor: Jean Rodriguez H.
  3. fecha: Sabado 4 de Noviembre, 2017
  4. nombre del programa: collar de perlas
  5. descripcion: cada linea corresponde a un caso distinto, en el que se ingresa el tamaño de unas perlas (hasta ingresar un 0). el programa
  6.             analiza la capacidad de crear un collar simetrico con las perlas de acuerdo a su tamaño y muestra el orden por pantalla.
  7.             el programa finaliza con una linea con un 0. ejemplo:
  8.             input                                                   output
  9.             2 3 2 3 5 7 5 0                                         2 3 5 7 5 3 2
  10.             2 2 7 10 0                                              NO
  11.             10 0                                                    10
  12.             1 1 1 1 1 0                                             1 1 1 1 1
  13.             1 2 1 2 1 1 3 0                                         1 1 2 3 2 1 1
  14.             0
  15. */
  16.  
  17. #include  <stdio.h>
  18. #include  <stdlib.h>
  19.  
  20. typedef struct perla{
  21.     int tamano; //tamaño de la perla
  22.     long long cantidad; //cantidad de perlas (segun el tamaño)
  23. }perla;
  24.  
  25. void reparar(unsigned long long *collar, unsigned long long total); //se crea el collar simetrico de ser posible
  26. int compara(const void *a, const void *b);
  27.  
  28. int main(void)
  29. {
  30.     unsigned long long n; //tamaño de la primera perla de cada caso
  31.     scanf("%llu",&n);
  32.     //finaliza cuando la primera perla de cada caso es de tamaño 0
  33.     while(n)
  34.     {
  35.         unsigned long long *collar = NULL; //collar de perlas a ordenar de forma simetrica
  36.         unsigned long long total = 0; //total de perlas en cada caso
  37.         /* se guardan las siguientes perlas hasta que aparezca un 0*/
  38.         while(n) {
  39.             collar = (unsigned long long *)realloc(collar, sizeof(unsigned long long)*(total+1));
  40.             if(collar == NULL) {
  41.                 printf("Operacion fallida");
  42.                 EXIT_FAILURE;
  43.             }
  44.             collar[total] = n;
  45.             total++;
  46.             scanf("%llu",&n);
  47.         }
  48.         reparar(collar, total);
  49.         free(collar);
  50.         scanf("%llu",&n);
  51.     }
  52.     return 0;
  53. }
  54.  
  55. void reparar(unsigned long long *collar, unsigned long long total)
  56. {
  57.     perla *perlas = NULL; //perlas segun su tamaño
  58.     unsigned long long perlas_ordenadas = 1; //total de tamaños distintos entre las perlas
  59.     unsigned long long i, j, k;
  60.     qsort(collar, total, sizeof(unsigned long long), compara); //orden ascendente
  61.     long long mayor = collar[total-1]; //perla mas grande
  62.     /* se cuenta el total de tamaños diferentes en el collar */
  63.     for(i=0 ; i<total-1 ; i++) {
  64.         if(collar[i] != collar[i+1]) perlas_ordenadas++;
  65.     }
  66.    
  67.     /* se organizan las perlas segun su tamaño */
  68.     perlas = (perla *)calloc(perlas_ordenadas, sizeof(perla));
  69.     if(perlas == NULL) {
  70.         printf("Operacion fallida\n");
  71.         EXIT_FAILURE;
  72.     }
  73.     for(i=0 ,j=0 ; i<total ; i++) {
  74.         perlas[j].cantidad++;
  75.         if(collar[i] != collar[i+1]) {
  76.             perlas[j].tamano = collar[i];
  77.             j++;
  78.         }
  79.     }
  80.    
  81.     /* se comprueba si es posible lograr la simetria en el collar de perlas
  82.        se considera asimetrico cuando la cantidad de perlas mas grandes es un numero par */
  83.     if(perlas[perlas_ordenadas-1].cantidad%2 == 0) {
  84.         printf("NO\n");
  85.         return;    
  86.     }
  87.     for(i=0 ; i<perlas_ordenadas  ; i++) {
  88.         if((perlas[i].cantidad%2)&&(i<perlas_ordenadas-1)) {
  89.             printf("NO\n");
  90.             return;
  91.         }
  92.     }
  93.    
  94.     /* se organizan las perlas de forma simetrica, desde afuera hacia adentro */
  95.     for(i=0,j=total-1,k=0 ; i<j ; i++,j--) {
  96.         if(perlas[k].cantidad) {
  97.             collar[i]=perlas[k].tamano;
  98.             collar[j]=perlas[k].tamano;
  99.             perlas[k].cantidad-=2;
  100.         }
  101.         else {
  102.             k++;
  103.             j++;
  104.             i--;
  105.         }
  106.     }
  107.     collar[i]=mayor;
  108.    
  109.     /* se muestra el collar ordenado simetricamente */
  110.     for(i=0 ; i<total ; i++) printf("%llu ",collar[i]);
  111.     printf("\n");
  112. }
  113.  
  114. int compara(const void *a, const void *b)
  115. {
  116.     const int *p = a;
  117.     const int *q = b;
  118.     return((*p) > (*q));
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement