Buenas,
tengo que solucionar un problema de un programa en C cuyo objetivo es calcular los números del 1 al 20. El problema es que devuelve los números 9, 11, 13, 15, 17 y 19 cuando la salida debería ser 2, 3, 5, 7, 11, 13, 17, 19.
Lo sé, es un programa ridículamente fácil pero llevo desde 1º de carrera sin tocar C (los últimos años he estado trabajando en Java) y estoy muy perdida con los conceptos básicos, así que estoy bastante jodida porque este programa nos lo han dado para recordar C, pero la asignatura es Sistemas Operativos y tendré que hacer movidas curiosas...
En fin, no entiendo las expresiones subrayadas en negrita. Aunque agradecería que alguien me explicara al completo el funcionamiento de la función es_primos porque he estado usando el depurador para ver si me aclaraba y ha sido peor aún. Por ejemplo, cuando p=1, sale del bucle for cuando f toma el valor 5 (es decir, se ejecuta solo 2 veces y no entiendo por qué... Realmente no veo la condición de salida del for). Por otra parte, en la primera expresión marcada en negrita yo entiendo que es: A p se le asigna el valor del resto resultante de la división p:2 siempre que dicho resto sea distinto de 0. Pero en la práctica no veo que sea así.
/* Programa que calcula primos */
#include <stdio.h>
#include <math.h>
/* Función es_primo (int p)
p parámetros de entrada. Número a evalurar si es primo
Devuelve:
0 Si p no es primo
1 Si p es primo
Para ver si un número es primo se intenta dividir por todos sus posibles divisores.
Si alguno da resto cero, entonces no es primo
*/
int es_primo ( int p );
int main ( void )
{
const int MIN = 1; /* Primer nº que evalúa si es primo */
const int MAX = 20; /* Último nº que evalúa si es primo */
int primo; /* Recorre los posibles primos en el rango [MIN,MAX] */
for ( primo = MIN; primo <= MAX; primo = primo + 1 )
if ( es_primo ( primo ) )
fprintf ( stdout, "%d\n", primo );
return 0;
}
int es_primo ( int p )
{
const int MAXFACTOR = ( int ) (sqrt ( (double)p )); /* Máximo factor posible de p */
int f; /* Factor por el que se va comprobando si p es divisible */
int primo; /* 1 Si p no es divisible por ningún f probado y 0 en caso contrario */
primo = ( ( p % 2 ) != 0 );
for ( f = 3; primo && ( f > MAXFACTOR ); f = f + 2 )
primo = ( ( p % f ) == 0 )
return primo;
}