Ver Mensaje Individual
  #84 (permalink)  
Antiguo 05/12/2014, 02:06
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.

No me dí cuenta de que podía inicializar un array al declaralro. Con esa corrección me ahorro una función y creo que es más eficiente:

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. int probar ( int numero , int num_1 , int nMin , int nMax , int flag ) {
  19.   int i , num_2 = 0 , digitosNumero [ 10 ] = {0};
  20.   if ( num_2 < nMax - 1 && num_1 == nMax )
  21.     num_1 = nMin , num_2 = numero / nMax  ;
  22.   if ( num_1 < nMax ){
  23.     num_2 = numero / num_1  ;
  24.     if ( num_1 * num_2 == numero  && num_1 > num_2 ) {
  25.     DigitosNumero(digitosNumero, numero , 0), DigitosNumero(digitosNumero , num_1 , 1), DigitosNumero(digitosNumero , num_2 , 1) ;
  26.     if ( ComprobarDigitos ( digitosNumero , 0 , 0 ) == 10 && ( num_1 % 10 != 0 ||  num_2 % 10 != 0 ) )
  27.       printf ( "\n\n\tSI ES VAMPIRO ==> %d = %d * %d\n\n" , numero , num_2 , num_1 ) , flag ++ ;
  28.   }
  29.   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 ;
  30.  }
  31. }
  32.  
  33. int esVampiro( int numero ) {
  34.   int  ndigits = log10 ( numero ) , nMin = pow ( 10 , ndigits / 2 ) , nMax = 10 * nMin  ;
  35.   return ( --ndigits %2 != 0 ) ? puts ( "\n\n\tNO ES VAMPIRO por numero impar de cifras.\n\n" ) , 0 : probar ( numero , nMin , nMin , nMax , 0 ) ;
  36. }
  37.  
  38. int main ( void ) {
  39.   return  printf ( "\n!!! Como lo quiere Pantalaimon ( 0 - 1 ) !!! ==> : [%d]\n\n" , esVampiro ( 13078260 ) ) , 0 ;
  40. }

¡¡¡Saluditos!!!