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

Diagrama de flujo del ejercicio 05

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.

  1. Caso especial primeroif (n < 2) return 0;. Ni 0, ni 1, ni los negativos son primos, y descartarlos de entrada evita líos en el bucle.
  2. Probar divisores — el bucle recorre d desde 2 y comprueba n % d == 0. En cuanto un d divide exacto, return 0; sale de inmediato: ya sabemos que no es primo, no hace falta seguir.
  3. El truco de la raíz — la condición del bucle es d * d <= n, es decir, se para en la raíz cuadrada de n. No hace falta llegar hasta n: si n tuviera 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.
  4. 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.

Conexiones