Enumerando los primeros seis números primos: 2, 3, 5, 7, 11 y 13, podemos ver que el 6to primo es 13.
¿Cuál es el 10,001o número primo?
Solución a partir de un ciclo for y while:
1.- Se declaran las variables necesarias, una bandera de tipo boolean que definirá si es o no un número primo, y dos de tipo entero que generarán la serie de números (primo) y divisor para el número por el que se dividirá primo.
2.- Comienza un ciclo for, donde se introduce la variable posicion, que será la responsable de ir almacenando la posición del número primo, se limita al ciclo hasta que posicion alcance el valor buscado de 10,001 y la variable primo irá aumentando en 1 en cada ciclo.
3.- Al estar en el ciclo, bandera cambiará a true y divisior tomará el valor de dos, cada vez que entre al ciclo, ejecutará estas dos acciones para poder validar correctamente el while e if que se declaran después.
4.- Inicia ciclo while, el cuál se mantendrá mientras divisor sea menor a la división de primo entre 2, con el fin de reducir divisiones en el proceso, ya que si divisor a alcanzado en valor a la mitad de primo, no tiene caso seguir ejecutando más divisiones mayores, se podrá definir si es o no primo de inmediato, según sea el caso, junto con la segunda condición del while, que se mantendrá mientras también bandera siga siendo verdadera.
5.- Se complementa el while con una condición if, que determina que si el residuo de primo entre divisor es 0, bandera que colocará en false para salir del while. Fuera de esta condición, bandera irá incrementando en 1 en cada ciclo que vaya procesando en el while.
Ejemplo con el número 5:
primo = 5
divisor = 2
mitad = 2
bandera = true
while: ¿2 es menor o igual a 2 y bandera es true?
Sí .: Entra en la condición IF .: ¿5%2==0?
No .: divisor++ .: divisor = 3
while: ¿3 es menor o igual a 2 y bandera es true?
No .: termina el ciclo, valida el siguiente if, posicion aumenta en 1, valida si ha llegado al 1001, y si es así, imprime resultado, si no. entra el ciclo for.
6.- Al salir del while, se añade una condición if que validará el estado de bandera, si éste aún está en true, entonces sabemos que el número es primo (como en el caso anterior de 5) porque solo se modificó la variable divisor y la variable bandera jamás cambió, y dentro de este if, posicion aumentará en 1 cada vez que se encuentre un primo, después se añadirá un 2do if para determinar si posicion ha alcanzado la posición que buscamos (10001), de ser así, se imprimirá entonces el número primo correspondiente:
Ejemplo con un número no primo:
primo = 9
divisor = 2
mitad = 4
bandera = true
while: ¿2 es menor o igual a 4 y bandera es true?
Sí .: Entra en la condición IF .: ¿9%2==0?
No .: divisor++ .: divisor = 3
while: ¿3 es menor o igual a 4 y bandera es true?
Sí .: Entra en la condición IF .: ¿9%3==0?
Si .: bandera = false y divisor++ .: divisor = 3
while: ¿4 es menor o igual a 4 y bandera es true?
No .: Sale del while
if: ¿bandera es true?
No .: Ciclo for aumenta a primo a 10.
Código JAVA:
public class problemasiete {
public static void main(String[] args) {
boolean bandera;
int divisor, primo=2;
for (int posicion=0; posicion < 10001; primo++) {
bandera = true;
divisor = 2;
while(divisor <= primo/2 && bandera==true) {
if (primo % divisor == 0) {
bandera = false;
}
divisor++;
}
if (bandera) {
posicion++;
if (posicion == 10001){
System.out.println("El número primo " + posicion + " es " + primo);
}
}
}
}
}
No hay comentarios:
Publicar un comentario