Ver Mensaje Individual
  #73 (permalink)  
Antiguo 03/12/2014, 10:13
Avatar de leosansan
leosansan
 
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Petando la pila. Problemas y retos usando recursividad.

A la vista de los últimos códigos no me ha quedado más remedio que adelgazar mi último código en ¡¡¡ 40 líneas ¡¡¡ así como el número de argumentos de las funciones:

Código C++:
Ver original
  1. #include<stdio.h>
  2. #include <math.h>
  3.  
  4. int DigitosNumero ( int digitosNumero [ 10 ], int numero , int flag ) {
  5.   if ( numero > 0 && flag == 0 )
  6.     digitosNumero [ numero % 10 ]++ , DigitosNumero ( digitosNumero , numero / 10 , 0 ) ;
  7.   else if ( numero > 0 && flag == 1 )
  8.     digitosNumero [ numero % 10 ]-- , DigitosNumero ( digitosNumero , numero / 10 , 1 ) ;
  9.   else return 1 ;
  10. }
  11.  
  12. int ComprobarDigitos ( int digitosNumero [ 10 ] , int indice , int cont ) {
  13.   if ( indice < 10 )
  14.     return ( digitosNumero [ indice ] == 0 ) ? 1 + ComprobarDigitos ( digitosNumero , indice + 1 , cont + 1 ) : ComprobarDigitos ( digitosNumero , indice + 1 , cont  ) ;
  15.   return 0 ;
  16. }
  17.  
  18. void inicializar_digitosNumero ( int digitosNumero [ 10 ] , int indice ) {
  19.   if ( indice < 10 )
  20.     digitosNumero [ indice ] = 0 , inicializar_digitosNumero ( digitosNumero , indice + 1 ) ;
  21. }
  22.  
  23. int probar ( int numero , int num_1 , int nMin , int nMax , int flag ) {
  24.   int num_2 = 0 , digitosNumero [ 10 ] ;
  25.   if ( num_2 < nMax - 1 && num_1 == nMax )
  26.     num_1 = nMin , num_2 = numero / nMax  ;
  27.   if ( num_1 < nMax ){
  28.     num_2 = numero / num_1  ;
  29.     if ( num_1 * num_2 == numero  && num_1 > num_2 ) {
  30.     inicializar_digitosNumero ( digitosNumero , 0  ) , DigitosNumero ( digitosNumero , numero , 0 ) ;
  31.     DigitosNumero ( digitosNumero , num_1 , 1 ) , DigitosNumero ( digitosNumero , num_2 , 1 ) ;
  32.     if ( ComprobarDigitos ( digitosNumero , 0 , 0 ) == 10 && ( num_1 % 10 != 0 ||  num_2 % 10 != 0 ) )
  33.       printf ( "\n\n\tSI ES VAMPIRO ==> %d = %d * %d\n\n" , numero , num_2 , num_1 ) , flag ++ ;
  34.   }
  35.   return ( num_1 < nMax - 1 ) ? probar ( numero , 1 + num_1 , nMin , nMax , flag ): ( flag == 0 ) ? printf ( "\n\n\t%d NO ES VAMPIRO\n\n"  , numero  ) , 0 : 1 ;
  36.  }
  37. }
  38.  
  39. int esVampiro( int numero ) {
  40.   int  ndigits = log10 ( numero ) , nMin = pow ( 10 , ndigits / 2 ) , nMax = 10 * nMin  ;
  41.   if ( --ndigits %2 != 0 )
  42.     return puts ( "\n\n\tNO ES VAMPIRO por numero impar de cifras.\n\n" ) , 0 ;
  43.   return probar ( numero , nMin , nMin , nMax , 0 ) ;
  44. }
  45.  
  46. int main ( void ) {
  47.   return  printf ( "\n!!! Como lo quiere Pantalaimon ( 0 - 1 ) !!! ==> : [%d]\n\n" , esVampiro ( 13078260  ) ) , 0 ;
  48. }

¡¡¡Saluditos!!!


Última edición por leosansan; 03/12/2014 a las 10:31