Ver Mensaje Individual
  #82 (permalink)  
Antiguo 04/12/2014, 10:06
kutcher
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 10 años
Puntos: 13
Respuesta: Petando la pila. Problemas y retos usando recursividad.

Cita:
Iniciado por Pantaláimon Ver Mensaje
Buenas!
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, me gustaría subir vuestras soluciones en un repositorio de github donde haría referencia sobre la autoría de cada código y haría referencia al hilo donde se ha escrito.

Si estáis de acuerdo confirmádmelo por privado.

Un saludo!
Por mi parte estoy de acuerdo creo que seria lo mas conveniente para mantener el orden y de paso ahora que vuelvo a leer el enunciado la cuestión era retornar uno o cero según el numero dado sea o no vampiro no imprimirlo:

Código C++:
Ver original
  1. #define MAX(a,b) ((a)>(b)?(a):(b))
  2. #define MIN(a,b) ((a)<(b)?(a):(b))
  3.  
  4. int dec[] = { 1, 10, 100, 1000, 10000, 100000 };
  5. int cant(int num, int t)
  6. {
  7.     if (!num) return t;
  8.     t +=  1 << (num % 10) * 6;
  9.     return cant(num / 10, t);
  10. }
  11. int comprobar(int min, int max, int num, int b, int t)
  12. {
  13.     if(min >= max) return 0;
  14.     b = num / min;
  15.     if (min * b == num && ((min % 10) || (b%10))
  16.         && t == cant(min, 0) + cant(b, 0))
  17.         return 1;
  18.     return comprobar(min + 1, max, num, b, t);
  19. }
  20. int es_vampiro(int num)
  21. {
  22.     int min, max, b = 0, nd = log10(num)+1, t = cant(num, 0);
  23.     if (nd % 2) return 0;
  24.     nd /= 2;
  25.     min = MAX(dec[nd - 1], (num + dec[nd] - 2)/(dec[nd] - 1));
  26.     max = MIN(num/min, sqrt(num));
  27.     return comprobar(min, max, num, b, t);
  28. }
  29. int main(void)
  30. {
  31.     printf("\n%d\n", es_vampiro(1001795850));
  32.     return 0;
  33. }

Saludos