Buenas
Fijándome en los códigos de la función
descompon, estoy viendo implementaciones que no respetan del todo lo que pedí en el enunciado. O al menos que no siguen la idea que quise expresar con esa norma.
Cita: 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.
La idea de tener una bandera
ver era para poder ponerla a 0 y medir el tiempo de ejecución del código sin las interferencias que pudiera producir mostrar la salida estándar. El problema es que hay códigos que dejan de hacer ciertos cálculos que no son meramente de mostrar los resultados cuando
ver == 0.
Un ejemplo claro es el de
kutcher donde hay el siguiente código:
Código C++:
Ver originalif(ver)
cout << a << " = " << factor_primo(a, 2, fact) << endl;
si
ver == 0 no se ejecutará
factor_primo que, a parte de instrucciones de visualización, también ejecuta otras instrucciones como la función
comprobar_primo que son 100% de cálculo.
La interpretación de
leosan ha sido tratar el flag
ver como un exponente. O almenos eso parece en la función
imprimir. De hecho, el código de
leosan no implementa lo pedido ya que llama a
descompon ( 1500 , 1550, 0 ) y esto no debería mostrar ninguna salida por pantalla.
La implementación de
eferion es la que es más parecida a lo que quería. Si
ver == 0 el cálculo de los factores y su exponente se hace siempre. En cambio el conjunto de cálculos sobre cómo mostrarlos (encapsulados en la macro IMPRIMIR) no se hacen.
Yo quizá buscaba la interpretación más estricta, haciendo todos los cálculos, incluso ejecutando las condiciones que calculan cómo mostrar la descomposición de factores de los números y sólo evitando las funciones de salida estándar como printf, puts, el operador << de C++.
Pongo el código de eferion modificado para poner de ejemplo de la idea que quiero expresar:
Código C:
Ver original#include <stdio.h>
#define IMPRIMIR( base, exponente, primerPrimo, ver ) \
if ( primerPrimo == 0 && ver) printf( " *" ); \
if ( exponente == 1 && ver) printf( " %d", base ); \
else if ( exponente > 0 && ver) printf( " %d^%d", base, exponente )
int ComprobarPrimo( int* numero, int candidato )
{
if ( *numero % candidato == 0 )
{
*numero /= candidato;
return 1 + ComprobarPrimo( numero, candidato );
}
return 0;
}
void bucleChequeo( int numero, int candidato, int primerPrimo, int ver )
{
int exp = ComprobarPrimo
( &numero
, candidato
); {
IMPRIMIR
( candidato
, exp, primerPrimo
, ver
); primerPrimo = 0;
}
candidato += 2;
if ( numero > 1 )
bucleChequeo( numero, candidato, primerPrimo, ver );
}
void descompon(int a, int b, int ver)
{
int actual = a;
int exp = ComprobarPrimo
( &actual
, 2 );
if ( ver
) printf( "%d =", a
); IMPRIMIR
( 2, exp, 1, ver
);
bucleChequeo
( actual
, 3, exp == 0, ver
);
if ( ver )
if ( a < b )
descompon( ++a, b, ver );
}
int main() {
descompon(2, 1000, 0);
return 0;
}
Un saludo!