Ejercicio 9. Números primos

Crea un programa que muestre en pantalla los N primeros números primos.
Se pide por teclado la cantidad de números primos que queremos mostrar.

Este ejercicio presenta una dificultad mayor en cuanto a la optimización y el concepto matemático para el cálculo de los números primos que en lo que realmente es su desarrollo.

En matemáticas, un número primo es un número natural mayor que 1 que tiene únicamente dos divisores positivos distintos: él mismo y el 1

Con esto, básicamente podríamos crear un bucle que recorra los números del 1 al infinito, incluyendo un contador que nos indique cuántos números primos ha mostrado ya en pantalla, y una vez llegásemos al número solicitado por nuestro usuario que parase.

Este método, sería muy brusco, y obligaríamos al programa a hacer cálculos innecesarios, pues por ejemplo, sabemos que todos los números pares, mayores de dos, no pueden ser primos, y si un número no es divisible por dos, no lo será por ninguno par. De este modo, si evitamos las pruebas de estos números estaremos optimizando el programa.

¿Qué otra comprobación podríamos evitar? también hemos de saber, que un número si un número no es divisible por los números inferiores a la su raíz cuadrada, este número será primo. De este modo, en números muy grandes también limitaremos enormemente la cantidad de iteraciones a realizar en el bucle.

Con estos conocimientos como base, ¿cómo podemos enfocar el programa?

Variables necesarias

  • numPrimos. Será tipo int y deberá ser introducida por el usuario del programa, en ella almacenaremos la cantidad de números primos que debemos mostrar en pantalla.
  • contador. También de tipo entero, en ella almacenaremos el total de números que se van mostrando por pantalla.
  • esPrimo. Variable de tipo booleano que nos indicará si el número es primo o no.
  • num y divisor. Serán dos variables de tipo entero, que utilizaremos para recorrer los bucles y buscar los números primos. Para cada num, recorreremos los números posibles como divisor para hacer nuestros cálculos.

Bucles a realizar

Para nuestros cálculos hay que hacer dos bucles, uno que será indeterminado, y que dependerá de cuanto tiempo tardemos en encontrar los números solicitados, es decir, en que contador = numPrimos.

Este bucle lo podemos ver en las líneas 34 a 48, y vemos que en su interior, tenemos un segundo bucle, donde comprobamos que el divisor no es mayor o igual al valor de la raíz cuadrada de num y comprobamos si el número es primo o no.

Anotaciones de interés en este código:

  • En la línea 47, vemos como la variable num se incrementa en +2, esto, como comentábamos anteriormente es para evitar comprobar los valores de los números pares.
  • En la línea 41, pasa igual con la variable divisor, ya que si el número no es divisible por dos, tampoco lo será por el resto de pares.
package estructurasRepetitivas;

/**
08 Ejercicios Estructuras Repetitivas en Java

Programa:
Mostrar en pantalla los N primero número primos. Se pide por teclado la cantidad de números
primos que queremos mostrar.

@author: manolohidalgo_
@date: 11-11-19
*/

import java.util.Scanner;
// Inicio del programa y declaración de variables:
public class Ej09NumerosPrimos {
  public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);
    int numPrimos;
    int contador;
    boolean esPrimo;
    int divisor;
    int num;

// Inicio del programa, explicación al usuario
    System.out.println("El programa nos muestra una cantidad solicitada de números primos.");
// Pedimos datos al usuario
      System.out.print("Indicanos la cantidad de los primeros números primos que deseas conocer: ");
      numPrimos = scanner.nextInt();
// Iniciamos el ciclo para calcular el tiempo.   
    System.out.println("1: 2");
    contador = 1;
    num = 3;
    while (contador < numPrimos){
      esPrimo = true;
      divisor=3;
      while ((divisor<=Math.sqrt((num))) && esPrimo) {
        if (num%divisor==0) {
          esPrimo = false;
        }
        divisor +=2;
      }
      if (esPrimo){
        contador +=1;
        System.out.println(contador + ": " + num);
      }
      num +=2;
    }
  }
}

Puedes acceder a este ejercicio en GitHub en este enlace.

Espero que estos ejercicios de repaso de JAVA realizados durante el curso 2019/2020 en la clase de programación del I.E.S. Gran Capitán (Córdoba) puedan servirte si estás empezando, si tienes alguna duda al respecto, alguna sugerencia o algo que no te haya quedado claro, no tienes más que escribirme en los comentarios, estoy aquí para ayudarte y aprender, ¡Nos leemos!