Ejercicio 05 — Funcion es_primo(n) que devuelve 1 si n es primo
Dificultad: amarillo · Módulo 04 (Funciones)
Enunciado
Funcion es_primo(n) que devuelve 1 si n es primo. Imprime primos entre 2 y 50.
Diagrama de flujo

Cómo se resuelve
es_primo(int n) devuelve 1 si n es primo y 0 si no. Un número es primo si solo es divisible por 1 y por sí mismo, así que la estrategia es buscar un divisor: si encontramos uno, no es primo.
- Caso especial primero —
if (n < 2) return 0;. Ni 0, ni 1, ni los negativos son primos, y descartarlos de entrada evita líos en el bucle. - Probar divisores — el bucle recorre
ddesde 2 y comprueban % d == 0. En cuanto unddivide exacto,return 0;sale de inmediato: ya sabemos que no es primo, no hace falta seguir. - El truco de la raíz — la condición del bucle es
d * d <= n, es decir, se para en la raíz cuadrada den. No hace falta llegar hastan: sintuviera un divisor mayor que su raíz, su pareja sería otro divisor menor que ya habríamos encontrado antes. Esto acelera mucho la función. - Si el bucle termina sin encontrar divisor,
return 1;: es primo.
En main, un bucle de 2 a 50 llama a es_primo(i) y solo imprime los que dan 1. Fíjate en cómo la función esconde toda la lógica: main queda legible como un filtro.
Trampa típica: escribir d <= n (o incluso d < n) en el bucle. Funciona, pero hace muchísimo más trabajo del necesario. La otra trampa clásica es olvidar el caso n < 2 y que la función clasifique mal el 0 o el 1.
Para practicar — cópialo en Dev-C++
Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.
/*
* Curso de C — Modulo 04: Funciones
* Ejercicio 05 — PRACTICA (rellena los TODO)
* Enunciado: Funcion es_primo(n) que devuelve 1 si n es primo. Imprime primos entre 2 y 50.
* Dificultad: amarillo
* Compilar: gcc -std=c11 -Wall ej05_practica.c -o ej05 && ./ej05
*/
#include <stdio.h>
/* TODO: escribe el prototipo de es_primo */
int main(void) {
printf("Primos entre 2 y 50:\n");
/* TODO: bucle de 2 a 50; si es_primo(i), imprime i seguido de espacio */
printf("\n");
return 0;
}
/* TODO: define int es_primo(int n)
* - n < 2 -> no es primo (devuelve 0)
* - prueba divisores d desde 2; para cuando d*d > n (no necesitas ir hasta n)
* - si n % d == 0 para algun d, no es primo (devuelve 0)
* - si el bucle termina sin encontrar divisor, es primo (devuelve 1)
*/Solución — cópiala y ejecútala
/*
* Curso de C — Modulo 04: Funciones
* Ejercicio 05 — MODELO (resuelto)
* Enunciado: Funcion es_primo(n) que devuelve 1 si n es primo. Imprime primos entre 2 y 50.
* Dificultad: amarillo
* Compilar: gcc -std=c11 -Wall ej05_modelo.c -o ej05 && ./ej05
*/
#include <stdio.h>
/* Prototipo */
int es_primo(int n);
int main(void) {
printf("Primos entre 2 y 50:\n");
for (int i = 2; i <= 50; i++) {
if (es_primo(i)) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
/* Devuelve 1 si n es primo, 0 si no.
* Algoritmo: probamos divisores desde 2 hasta sqrt(n).
* Si encontramos uno que divide exactamente, no es primo. */
int es_primo(int n) {
if (n < 2) return 0;
for (int d = 2; d * d <= n; d++) {
if (n % d == 0) return 0;
}
return 1;
}Cómo usarlo
Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.