(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 MOD (nos da el resto de una división):

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 para.
El resultado de cada división es evaluado por un condicional si-entonces, 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 para. Un segundo condicional si-entonces analiza si el valor de contar es igual a 2, de ser así significa que n es primo.
Analizamos el código
Algoritmo primos Escribir "Ingrese número para analizar si es primo: " // Guardamos el número a analizar en la variable n. Leer n // Creamos una variable para contar cuantas veces puede ser dividido "n". Contar <- 0 // Recorremos en un buble todas las posibilidades desde 1 hasta el número ingresado. Para i <- 1 Hasta n Hacer // Dividimos el nímero por la variable del buble "i". Si n%i=0 Entonces // Si el resto da 0 sumamos 1 a la variable "contar". contar <- contar + 1 FinSi FinPara // Si contar sumo 2 el número es primo. Si contar = 2 Entonces Escribir n, " es primo." SiNo Escribir n, " no es primo." FinSi FinAlgoritmo
Ejecutamos el programa
Veamos el código en C++:
// 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.
Ahora el código en PYTHON:
# NÚMEROS PRIMOS.
contar = 0
n = int(input("Ingrese número para analizar si es primo: "))
# Recorremos en un bucle todas las posibilidades desde 1
# hasta el número ingresado.
for i in range(1, n+1):
if n % i == 0:
#Si el resto da 0 sumamos 1 a la variable contar.
contar = contar + 1
# Si contar llego a sumar 2, el número es primo.
if contar == 2:
print(f"{n} es primo.")
else:
print(f"{n} no es primo.")
Vamos a analizar línea por línea este código en PYTHON:
Línea 1: # NÚMEROS PRIMOS.
- Esta es una línea de comentario que indica el propósito del programa, que es analizar si un número es primo.
Línea 2: contar = 0
- Se declara una variable llamada “contar” y se le asigna un valor inicial de 0. Esta variable será utilizada para contar los factores del número ingresado por el usuario.
Línea 3: n = int(input("Ingrese número para analizar si es primo: "))
- Se pregunta al usuario que ingrese un número, y se le asigna a la variable “n“. La función “input()” permite al usuario ingresar texto, pero en este caso queremos un número entero, por lo que utilizamos el método “int()” para convertir el texto ingresado a un número entero.
Línea 4: # Recorremos en un bucle todas las posibilidades desde 1
- Esta es una línea de comentario que indica que vamos a realizar un ciclo que recorra todos los números posibles desde 1 hasta el número ingresado por el usuario.
Línea 5: # hasta el número ingresado.
- Continúa la explicación del anterior punto, señalando que el ciclo será realizado hasta llegar al número ingresado por el usuario.
Líneas 6-9:
for i in range(1, n+1):
if n % i == 0:
#Si el resto da 0 sumamos 1 a la variable contar.
contar = contar + 1
- El ciclo se ejecuta con un valor de “i” que va desde 1 hasta el número ingresado por el usuario (inclusive). En cada iteración, se verifica si el resto de la división del número ingresado por el valor actual de “i” es igual a 1. Si es así, significa que “i” es un factor del número ingresado y se incrementa el contador “contar“.
Línea 11: # Si contar llego a sumar 2, el número es primo.
- Esta línea de comentario señala la condición que determinará si el número ingresado por el usuario es primo o no.
Líneas 12 y 15:
if contar == 2:
print(f"{n} es primo.")
else:
print(f"{n} no es primo.")
- Si el contador “contar” tiene un valor de 2, significa que solo hay dos factores del número ingresado (1 y el mismo número), por lo que se imprime en pantalla que el número es primo. En caso contrario, se imprime que el número no es primo.
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 seria suficiente para saber que no es primo, y no haría falta contar todos sus divisores.
Esto lo resolvemos con una estructura Mientras (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 hacendo uso de una estructura Mientras (while):

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 si-entonces, que verifica que el resto sea igual a 0, de ser así suma 1 a la variable contar. Aquí a diferencia del programa antrior, si la variable contar llegara a ser mayor que 2, se le asignará a i el valor de n para finalizar la busqueda. El segundo condicional si-entonces analiza si el valor de contar es igual a 2, de ser así significa que n es primo.
Analizamos el código
Algoritmo primos2 Escribir 'Ingrese número para analizar si es primo: ' // Guardamos el número a analizar en la variable n. Leer n // Creamos una variable para contar cuantas veces puede ser dividido "n". contar <- 0 i <- 1 // Recorremos en un buble todas las posibilidades mientras la variable "i" sea menor o igual a la variable "n". Mientras i<=n Hacer Si n MOD i=0 Entonces // Si el resto da 0 sumamos 1 a la variable "contar". contar <- contar+1 Si contar>2 Entonces // Si contar ya supera a 2 asignamos n a i para salir del bucle. i <- n FinSi FinSi i <- i+1 FinMientras // Si contar sumo 2 el número es primo. Si contar=2 Entonces Escribir n, ' es primo.' SiNo Escribir n, ' no es primo.' FinSi FinAlgoritmo
Ejecutamos el programa
Veamos el código en C++:
// 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 precedirlas 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.
Ahora el código en PYTHON:
# NÚMEROS PRIMOS 2.
# Guardamos el número a analizar en la variable n.
n = int(input("Ingrese número para analizar si es primo: "))
# Creamos una variable para contar cuantas veces puede ser dividido "n".
contar = 0
i = 1
# Recorremos en un buble todas las posibilidades mientras la variable "i"
# sea menor o igual a la variable "n".
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 sumo 2, el número es primo.
if contar == 2:
print(f"{n} es primo.")
else:
print(f"{n} no es primo.")
Vamos a analizar línea por línea este código en PYTHON:
Línea 1: # NÚMEROS PRIMOS 2.
Este es un comentario en Python. El texto entre las comillas dobles (“”” o ”) se ignora por el intérprete.
Línea 4: n = int(input("Ingrese número para analizar si es primo: "))
Esta línea permite ingresar al usuario un número entero y lo guardan en la variable n. La función input() retorna una cadena de caracteres, por lo que se usa int() para convertirla a un entero.
Línea 6: contar = 0
Esta línea declara una variable entera llamada contar y la inicializa en cero. Esta variable será usada para contar la cantidad de divisores del número ingresado.
Línea 7: i = 1
Esta línea declara una variable entera llamada i y la inicializa en uno. Esta variable será usada como índice en el bucle.
Líneas 10-17:
while i <= n:
if n % i == 0:
contar = contar + 1
if contar > 2:
i = n
i = i + 1
Este es un bucle while que recorre todos los números desde uno hasta el número ingresado (n). El bucle se ejecuta mientras i sea menor o igual a n. Dentro del bucle:
- Línea 11:
if n % i == 0
Esto comprueba si el resto de la división denentreies igual a cero. Si es así, se cumple la condición del if. - Líneas 12-13:
{ ... }
Si el resto es cero, se incrementa en uno la variablecontar. Sicontarya tiene un valor mayor a dos, entonces se asigna aiel valor den, para que el bucle termine. - Línea 17:
i = i + 1
Se incrementa en uno el valor dei, para seguir recorriendo los números.
Líneas 20-23:
if contar == 2:
print(f"{n} es primo.")
else:
print(f"{n} no es primo.")
Si la cantidad de divisores (contar) es igual a dos, 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 dos), se imprime otro mensaje indicando que el número ingresado no es primo.
Nota: En Python, no hay una instrucción return 0, como en C o C++. Cuando un programa termina correctamente, simplemente termina ejecutándose.
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.