Ver Mensaje Individual
  #83 (permalink)  
Antiguo 04/12/2014, 20:09
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Petando la pila. Problemas y retos usando recursividad.

Hola,

Cita:
Iniciado por Pantaláimon Ver Mensaje
... Para tener el código que habéis ido proponiendo más centralizado a la par que pueda poner en cada directorio su eficiencia, y que vosotros podáis ir reclamando si hago trampa o no en su medición, ...
En ese caso tendré que hacer algunas modificaciones al código, para optimizarlo por lo menos un poco. Pero aprovechando que en el anterior todavía dejé un ciclo en el main y un array variable, de una vez aprovecho para corregirlo.

Con esas modificaciones esta sería mi solución al reto:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int count(const int value, const int i) {
  6.     return value ? count(value / 10, i + 1) : i;
  7. }
  8.  
  9. void split(const int value, int *dst) {
  10.     if (value > 0) {
  11.         *dst = value % 10;
  12.         split(value / 10, dst - 1);
  13.     }
  14. }
  15.  
  16. int join(int value, const int src[], const int end, const int begin, const int dec) {
  17.     if (end - 3 >= begin) {
  18.         value += (src[end - 3] * dec * 1000) + (src[end - 2] * dec * 100) + (src[end - 1] * dec * 10) + (src[end] * dec);
  19.         return join(value, src, end - 4, begin, dec * 10000);
  20.     } else {
  21.         if (end - 2 >= begin) {
  22.             value += (src[end - 2] * dec * 100) + (src[end - 1] * dec * 10) + (src[end] * dec);
  23.             return join(value, src, end - 3, begin, dec * 1000);
  24.         } else {
  25.             if (end - 1 >= begin) {
  26.                 value += (src[end - 1] * dec * 10) + (src[end] * dec);
  27.                 return join(value, src, end - 2, begin, dec * 100);
  28.             } else {
  29.                 if (end >= begin) {
  30.                     value += src[end] * dec;
  31.                     return join(value, src, end - 1, begin, dec * 10);
  32.                 }
  33.             }
  34.         }
  35.     }
  36.     return value;
  37. }
  38.  
  39. void swap(int dst[], const int a, const int b) {
  40.     int t = dst[b]; dst[b] = dst[a]; dst[a] = t;
  41. }
  42.  
  43. int esvampiro3(const int value, int src[], const int digits) {
  44.     int value1 = join(0, src, (digits / 2) - 1, 0, 1);
  45.     int value2 = join(0, src, digits - 1, (digits / 2), 1);
  46.  
  47.     /* printf("%.4d x %.4d\n", value1, value2); */
  48.  
  49.     if (value1 * value2 == value && !(value1 % 10 == 0 && value2 % 10 == 0)) {
  50.         return 1;
  51.     }
  52.  
  53.     return 0;
  54. }
  55.  
  56. int esvampiro2(const int value, int src[], int c[], const int *digits, int i) {
  57.     if(i < *digits) {
  58.         if (c[i] < i) {
  59.             swap(src, i, i % 2 ? c[i] : 0);
  60.             if (esvampiro3(value, src, *digits)) {
  61.                 return 1;
  62.             }
  63.             c[i]++;
  64.             i = 1;
  65.         } else {
  66.             c[i++] = 0;
  67.         }
  68.         return esvampiro2(value, src, c, digits, i);
  69.     }
  70.     return 0;
  71. }
  72.  
  73. int esvampiro(const int value, int src[], int c[], const int *digits, int i) {
  74.     if (esvampiro3(value, src, *digits)) {
  75.         return 1;
  76.     }
  77.     return esvampiro2(value, src, c, digits, i);
  78. }
  79.  
  80. int esVampiro(int num) {
  81.     int digits = count(num, 0);
  82.     int memspc = digits * sizeof(int);
  83.  
  84.     int *n = malloc(memspc);
  85.     int *c = malloc(memspc);
  86.  
  87.     split(num, n + (digits - 1));
  88.     memset(c, 0, memspc);
  89.  
  90.     if (digits % 2 == 0) {
  91.         return esvampiro(num, n, c, &digits, 1);
  92.     }
  93.  
  94.     free(c);
  95.     free(n);
  96.  
  97.     return 0;
  98. }
  99.  
  100. int main(int argc, char** argv) {
  101.     printf("%d\n", esVampiro(1001795850));
  102.     return (EXIT_SUCCESS);
  103. }
Espero que no se me haya pasado algún error,
Saludos,