Consulta ejercicio 4

Consulta ejercicio 4

de Joaquín Manrique Machín -
Número de respuestas: 1

Buenas, estoy teniendo problemas con este ejercicio. Al principio ejecutaba y me tiraba los primeros dos números primos (2 y 3) y se paraba ahí, aunque le hubiera ingresado, por ejemplo, el 12. Le hice algunas modificaciones esperando arreglarlo, pero ahora escribe el mensaje del segundo writeln y no hace nada más. Mi código es el siguiente:

PROGRAM nprimos;

VAR
    n, divisor, fin, num : INTEGER;
    raiz : REAL;
    primo : BOOLEAN;

BEGIN
    writeln ('Escriba un numero natural.');
    readln (n);

(*Encontar los primeros n primos y calcular su raiz cuadrada*)
    writeln ('Los primeros ', n:1, ' primos y sus correspondientes raices cuadradas son:');
   
    num := 2;
    while num < n do
    begin
    (*Encontrar un numero primo*)
        primo := TRUE;
        fin := trunc(sqrt(num));
        divisor := 2;
   
        while (divisor <= fin) do
        begin
            if (num mod divisor = 0) then
            primo := FALSE
            else divisor := divisor + 1;
       
            if primo then
            begin
                raiz := sqrt(num);
                writeln (num, ' ---> ', raiz:1:3)
            end
        end;
        num := num + 1
    end  
END.

Agradecería mucho una ayuda para poder terminarlo. Saludos.

En respuesta a Joaquín Manrique Machín

Re: Consulta ejercicio 4

de Mateo Fontoura Abelenda -
Hola Joaquin cómo estás? La idea del ejercicio es mostrar n primos y su raíz cuadrada, por ejemplo en un supuesto si se ingresa n= 1 tu código directamente no muestra nada, siendo que debería mostrar un primo y su raíz cuadrada. Podrías aprovechar que FreePascal permite evaluación por circuito corto y utilizar el While para evaluar la posibilidad que sea primo es decir:
While (primo mod divisor <> 0) And (divisor<=fin) Do
divisor:=divisor+1;
En caso de que salga del While puede ser porque es primo es decir el divisor se hizo más grande que el fin, o porque encontró un divisor que hace que el resto sea igual a 0(no es primo) , para comprobar que haya salido por el motivo que queremos, es decir que sea primo, podemos utilizar un repeat, que haga que el While se repita hasta que encuentre un valor para primo que haga que salga, porque el divisor se hizo más grande que el fin, es decir:
Until (divisor > fin);
En caso de utilizar el repeat, no te olvides de incrementar el valor de primo para poder evaluar otro numero, hallar su fin y inicializar el divisor nuevamente en 2.
Recién ahí logramos encontrar el primer primo ahora hay que buscar n-1 primos y mostrar su raíz cuadrada, es decir vas a precisar un contador que incremente cuando se salga del repeat, pero todo anidado en un While, tal que While contador <= num, va a finalizar luego de que el contador se haga mayor a el número ingresado por la entrada, es decir luego de mostrar n primos y la raíz cuadrada de cada uno.