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; }
|