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

Cita:
Iniciado por Pantaláimon Ver Mensaje
Buenas!

Ahí van dos problemas más:
1) Ordena un array:
Crea una función ordena que dado un array con n enteros, lo transforme en otro con sus elementos ordenados de menor a mayor. El prototipo de la función es:
Código C:
Ver original
  1. void ordena(int array[], int n);
Este problema lo recomiendo hacer 100% recursivo, al menos los participantes habituales, que en eso reside la gracia del problema.
.................................................
Código BASH:
Ver original
  1. 2 = 2
  2. 3 = 3
  3. 4 = 2^2
  4. 5 = 5
  5. 6 = 2 * 3
  6. 7 = 7
  7. 8 = 2^3
  8. 9 = 3^2
  9. 10 = 2 * 5
- los factores se mostraran ordenados de menor a mayor
- si el factor no existe no se escribirá
- si el factor sólo aparece una vez no se mostrará elevado a 1 ("5 = 5" y no 5 = 5^1)
- habrá un espacio a izquierda y derecha de los simbolos = y *
- no habrá espacios entre el símbolo de elevar ^

El prototipo de la función es el siguiente:
Código C:
Ver original
  1. void descompon(int a, int b, int ver);
Cuando ver != 0 se mostrará la salida tal como he explicado.
Si ver == 0 se ejecuran los calculos que hayáis implementado pero no se mostrará nada por la salida estándar.
Este lo podéis hacer como queráis,
Pues ahora... ¡a petar la pila! O no...

Un saludo!
¡¡¡ Por fin sin ataduras ¡¡¡ . A pelo a mi me queda esto:

Código C++:
Ver original
  1. #include<stdio.h>
  2.  
  3. void descompon ( int a , int b , int ver ) ;
  4.  
  5. int main ( ) {
  6.     return descompon ( 1500 , 1550 , 0 ) , 0 ;
  7. }
  8.  
  9. void descompon( int a , int b , int ver ) {
  10.   int i , numero , n ;
  11.   for ( numero = a ; numero <= b ; numero ++) {
  12.     n = numero ;
  13.     while ( n > 1 ) {
  14.       printf( "%d = " , n ) ;
  15.       for ( i = 2 ; i <= n ; i++ , ver = 0 ) {
  16.         while ( n % i == 0 )  n /=  i , ver++ ;
  17.        if ( ver != 0 ) {
  18.           if ( ver == 1 && i < n )
  19.             printf( "%d * " ,i ) ;
  20.           else if ( ver == 1 && i > n )
  21.             printf( "%d" ,i ) ;
  22.           else if ( ver > 1 && i < n )
  23.             printf( "%d^%d * " ,i , ver ) ;
  24.           else if ( ver > 1 && i > n )
  25.             printf( "%d^%d" ,i , ver )  ;
  26.           }
  27.       }
  28.       putchar ( '\n' );
  29.     }
  30.   }
  31. }

Pero que veo:

Cita:
Iniciado por Pantaláimon Ver Mensaje
Buenas!

Ahí van dos problemas más:
.......................... pero recursivo conseguiréis más puntos.
Pues nada, a por el recursivo y los puntitos:
Código C++:
Ver original
  1. #include<stdio.h>
  2.  
  3. int descompon ( int a , int b , int ver ) ;
  4. int factorizar1 (  int i , int numero , int b , int ver ) ;
  5. void factorizar2 (  int i , int *n , int b , int ver  ) ;
  6. void imprimir( int i , int n, int b  , int ver ) ;
  7.  
  8. int main ( void ) {
  9.     return descompon ( 1500 , 1550, 0 ) , 0 ;
  10. }
  11.  
  12. int descompon ( int a , int b , int ver ) {
  13.   if ( a <= b ) {
  14.     printf( "%d = " , a ) ;
  15.     factorizar1 ( 2 , a ,  b  ,  ver ) ;
  16.     putchar ( '\n' );
  17.     return descompon (  a + 1 ,  b ,  ver ) ;
  18.   }
  19.   return 0 ;
  20. }
  21.  
  22. int factorizar1 (  int i , int numero , int b , int ver ) {
  23.   int n = numero ;
  24.   if ( i <= n ) {
  25.     factorizar2 ( i , &n  , b , ver ) ;
  26.     return factorizar1 ( i + 1  , n  ,  b  ,  ver ) ;
  27.   }
  28.   return 0 ;
  29. }
  30.  
  31. void factorizar2 (  int i , int *n , int b , int ver  ) {
  32.   while ( *n % i == 0 )
  33.     *n /=  i , ver++ ;
  34.   imprimir( i , *n , b , ver ) ;
  35. }
  36.  
  37. void imprimir( int i , int n, int b  , int ver ) {
  38.   if ( ver != 0 ) {
  39.     if ( ver == 1 && i < n )
  40.       printf( "%d * " ,i ) ;
  41.     else if ( ver == 1 && i > n )
  42.       printf( "%d" ,i ) ;
  43.     else if ( ver > 1 && i < n )
  44.       printf( "%d^%d * " ,i , ver ) ;
  45.     else if ( ver > 1 && i > n )
  46.       printf( "%d^%d" ,i , ver )  ;
  47.   }
  48. }

Y aquí una salida de muestra:

Código BASH:
Ver original
  1. 1500 = 2^2 * 3 * 5^3
  2. 1501 = 19 * 79
  3. 1502 = 2 * 751
  4. 1503 = 3^2 * 167
  5. 1504 = 2^5 * 47
  6. 1505 = 5 * 7 * 43
  7. 1506 = 2 * 3 * 251
  8. 1507 = 11 * 137
  9. 1508 = 2^2 * 13 * 29
  10. 1509 = 3 * 503
  11. 1510 = 2 * 5 * 151
  12. 1511 = 1511
  13. 1512 = 2^3 * 3^3 * 7
  14. 1513 = 17 * 89
  15. 1514 = 2 * 757
  16. 1515 = 3 * 5 * 101
  17. 1516 = 2^2 * 379
  18. 1517 = 37 * 41
  19. 1518 = 2 * 3 * 11 * 23
  20. 1519 = 7^2 * 31
  21. 1520 = 2^4 * 5 * 19
  22. 1521 = 3^2 * 13^2
  23. 1522 = 2 * 761
  24. 1523 = 1523
  25. 1524 = 2^2 * 3 * 127
  26. 1525 = 5^2 * 61

NOTITA: He visto en los últimos códigos que no incluyen la función main. Vamos compañeros que al público en general le puede resultar un mundo obtenerla y, al fin y al cabo, son unas pocas líneas de más, ánimo e incluir a a main.

¡¡¡Saluditos!!!