(Creado por el analista de sistemas y docente Leonel Iván Saafigueroa)
NÚMEROS PRIMOS
Un número primo se puede entender como un número natural mayor a uno que sólo se puede dividir por dos números: el número 1 (uno) y por el mismo, es decir, tiene únicamente dos divisores.

Algo que atrae a los Matemáticos son los desafíos, la distribución de los números primos es algo que se viene estudiando desde hace más de 2000 años, actualmente un ingeniero de Tennesse ha descubierto uno nuevo, se trata del mayor número primo conocido. Lo han llamado M77232917 y se consigue con el número 2 elevado a 77.232.917 menos 1. El número tiene nada menos que 23 millones de dígitos.

En el siguiente cuadro veremos los primeros 25 números primos:

Vamos a crear nuestro primer programa basado en una estructura condicional y el operador algebraico % (nos da el resto de una división):
Veamos el código:
Para esta primera versión se guarda el número ingresado por el usuario en una variable llamada n, la misma será divida por una variable llamada i, que tomará un valor que va de 1 a n, gracias a una estructura for.
El resultado de cada división es evaluado por un condicional if-else, que verifica que el resto sea igual a 0, de ser así suma 1 a la variable contar, la misma será iniciada siempre con el valor 0 antes de entrar en la estructura for. Un segundo condicional if-else analiza si el valor de contar es igual a 2, de ser así significa que n es primo.
// NÚMEROS PRIMOS.
#include <iostream>
using namespace std;
int n;
int contar=0;
int i;
int main()
{
cout << "Ingrese número para analizar si es primo: ";
cin >> n;
// Recorremos en un bucle todas las posibilidades desde 1
// hasta el número ingresado.
for(i=1;i<=n;i++)
{
if(n%i==0)
{
// Si el resto da 0 sumamos 1 a la variable contar.
contar++;
}
}
// Si contar llego a sumar 2, el número es primo.
if(contar==2)
{
cout << n << " es primo." << endl;
}
else
{
cout << n << " no es primo." << endl;
}
return 0;
}
Vamos a analizar línea por línea este código en C++:
Línea 1: // NÚMEROS PRIMOS.
Este es un comentario de una sola línea que indica el propósito del programa.
Línea 2: #include <iostream>
Esta línea incluye la biblioteca estándar iostream, que permite la entrada y salida de datos a través del teclado y la pantalla.
Línea 4: using namespace std;
Esto permite usar las funciones y variables de la biblioteca estándar sin tener que prefixarlas con el nombre de la biblioteca (en este caso, “std“).
Línea 6: int n;
Declara una variable entera llamada n, que será utilizada para almacenar el número ingresado por el usuario.
Línea 7: int contar=0;
Declara una variable entera llamada contar y la inicializa en 0. Esta variable contará el número de factores del número ingresado.
Línea 8: int i;
Declara una variable entera llamada i, que será utilizada como índice en un bucle.
Línea 10: int main()
Es el punto de entrada del programa, donde se ejecuta la función principal.
Línea 12: cout << "Ingrese número para analizar si es primo: ";
Imprime una mensaje al usuario solicitando que ingrese un número para analizar.
Línea 13: cin >> n;
Lee un entero desde el teclado y lo asigna a la variable n.
Línea 16: for(i=1;i<=n;i++) { ... }
Inicia un bucle que iterará desde 1 hasta el número ingresado (n). El índice i recorrerá cada posible factor del número.
Línea 18: if(n%i==0) { ... }
Dentro del bucle, se verifica si el resto de la división de n entre i es 0 (es decir, si i es un factor de n). Si es así, se incrementa el contador contar.
Línea 25: if(contar==2) { ... }
Después del bucle, se verifica si el contador contar es igual a 2. Si es así, significa que solo existen dos factores (1 y el propio número), por lo que el número es primo.
Línea 27: cout << n << " es primo." << endl;
Si el número es primo, se imprime un mensaje indicando que el número ingresado es primo.
Línea 29: else { ... }
Si el contador no es igual a 2, significa que existen más de dos factores y el número no es primo. Se imprime un mensaje indicando que el número ingresado no es primo.
Línea 33: return 0;
Finaliza la función principal con código cero.
OPTIMIZANDO EL CÓDIGO
Nuestro programa anterior buscaba la cantidad total de divisores que tiene el número ingresado, pero conociendo si tiene más de 2 divisores sería suficiente para saber que no es primo, y no haría falta contar todos sus divisores.
Esto lo resolvemos con una estructura While, con esta implementación vamos a ganar velocidad, sobre todo con números de muchas cifras.
Vamos a crear la segunda versión de nuestro programa haciendo uso de una estructura While:
Veamos el código:
Para esta segunda versión se guarda el número ingresado por el usuario en una variable llamada n, la misma será divida por una variable llamada i, que tomará un valor que va de 1 a n, mientras que i sea menor o igual a n.
El resultado de cada división es evaluado por un condicional if-else, que verifica que el resto sea igual a 0, de ser así suma 1 a la variable contar. Aquí, a diferencia del programa anterior, si la variable contar llegara a ser mayor que 2, se le asignará a i el valor de n para finalizar la búsqueda. El segundo condicional if-else analiza si el valor de contar es igual a 2, de ser así significa que n es primo.
// NÚMEROS PRIMOS 2.
#include <iostream>
using namespace std;
int n;
int contar=0;
int i=1;
int main()
{
cout << "Ingrese número para analizar si es primo: ";
cin >> n;
// Recorremos en un bucle todas las posibilidades desde 1
// hasta el número ingresado.
while(i<=n)
{
if(n%i==0)
{
// Si el resto da 0, sumamos 1 a la variable contar.
contar=contar+1;
if(contar>2)
{
// Si "contar" ya supera a 2, asignamos n a i para salir del bucle.
i = n;
}
}
i = i+1;
}
// Si contar llego a sumar 2, el número es primo.
if(contar==2)
{
cout << n << " es primo." << endl;
}
else
{
cout << n << " no es primo." << endl;
}
return 0;
}
Vamos a analizar línea por línea este código en C++:
Línea 1: // NÚMEROS PRIMOS 2.
Esto es un comentario en C++. El texto entre los caracteres / y * (y viceversa) se ignora por el compilador.
En este caso, el comentario indica que se trata del segundo programa para verificar si un número es primo.
Línea 2: #include <iostream>
Esta línea incluye la biblioteca estándar iostream, que permite la entrada y salida de datos en la consola. La función iostream es una de las más utilizadas en C++.
Línea 4: using namespace std;
Esta línea permite utilizar las clases y funciones definidas en el espacio de nombres estándar (std) sin tener que precederlas con std::. En este caso, se utiliza para acceder a la clase cout y otras funciones relacionadas.
Líneas 6-8: int n; int contar=0; int i=1;
Estas líneas declaran tres variables:
n: un entero que almacenará el número que se va a analizar.contar: un entero inicializado en 0, que se utilizará para contar la cantidad de divisores del númeron.i: un entero inicializado en 1, que se utilizará como índice en el bucle.
Línea 10: int main()
Esta es la función principal del programa. Su retorno determina el estado de finalización del programa.
Líneas 12-13: cout << "Ingrese número para analizar si es primo: "; cin >> n;
Estas líneas imprimen un mensaje en la consola solicitando al usuario que ingrese un número y, luego, leen ese número desde la entrada estándar. El contenido del número ingresado se almacena en n.
Línea 14-15: // Recorremos en un bucle todas las posibilidades desde 1 hasta el número ingresado.
Este es otro comentario que indica el objetivo del bucle.
Líneas 16-29: while(i<=n) { ... }
Este es el bucle principal del programa, que recorre todos los números, desde 1 hasta el número ingresado (n). El bucle se ejecuta mientras i sea menor o igual a n.
Dentro del bucle:
- Línea 18:
if(n%i==0)
Esto comprueba si el resto de la división denentreies igual a 0. Si es así, se cumple la condición del if. - Líneas 20-21:
{ // Si el resto da 0, sumamos 1 a la variable contar. contar=contar+1; ... }
Si el resto es 0, se incrementa en 1 la variablecontar. Sicontarya tiene un valor mayor a 2, entonces se asigna aiel valor den, para que el bucle termine. - Línea 22:
if(contar>2) { // ... }
Si la cantidad de divisores (contar) supera a 2, se sale del bucle asignando aiel valor den. - Línea 28:
i = i+1;
Se incrementa en 1 el valor dei, para seguir recorriendo los números.
Líneas 32-39: if(contar==2) { ... } else { ... }
Si la cantidad de divisores (contar) es igual a 2, entonces se imprime un mensaje indicando que el número ingresado es primo. Si no es así (es decir, si contar tiene algún valor distinto de 2), se imprime otro mensaje indicando que el número ingresado no es primo.
Línea 27: return 0;
La función main() termina con la instrucción return 0, lo cual indica que el programa ha finalizado correctamente.
TAREA PARA EL HOGAR
- Modifcar el programa para poder buscar los primeros 1000 números primos.
- Crear otra versión del programa que pueda buscar números primos por rangos. Por ejemplo del 1000 al 2000.