Los factores primos de 13195 son 5, 7, 13 y 29.
¿Cuál es el factor primo más grande del número 600,851,475,143?
Solución a partir de un ciclo for y while:
1.- Se declaran las variables necesarias, incluyendo una de tipo long (variable numero) debido al número muy grande a manejar, por lo cual, al final de dicha cifra se coloca la letra L.
2.- Se inicia el ciclo for que será el responsable de producir los número por los cuales iremos dividiendo(variable factor) nuestra variable numero, con la condición de que este contador sea menor o igual al número original.
3.- El ciclo while se inicia mostrando la condición de que mientras numero sea divisible entre el factor producido por el contador, seguirá usando este valor para seguir dividiendo, hasta que el número no sea divisible, saldrá del ciclo para aumentar el contador hasta encontrar un número divisible entre el valor actual de la variable numero.
Esto nos estaría reduciendo líneas de código y evitando crear un algoritmo más para determinar qué número son primos y cuales no y después dividir entre estos. Simplemente pintamos una lista común del 2 a N, mientras sea divisible entre 2, lo seguirá usando, y de está manera, eliminamos de la lista todos los número pares, al ya no ser divisible entre 2, se aumentará a 3 el contador y ahora, no saldrá de este ciclo mientras el residuo de igual manera siga siendo de 0 y así con todos los demás números.
4.- Se efectúa la operación en que la variable numero tomará el valor de dividir numero entre factor, usando el valor actual de factor que haya sido generado por el contador y que este siga siendo divisible entre el valor actual de numero (lo explicado en el punto anterior).
5.- Se puede terminar el problema agregando la LÍNEA OPCIONAL, la cual, iría imprimiendo todo el proceso de las divisiones que vaya generando, pudiendo ver el último número generado para saber el resultado, y de esta manera, se eliminaría la variable bandera y la impresión de la misma. Pero si se desea que lo único que se entregue es el resultado que nos interesa (el factor primo más grande), completaremos agregando la variable bandera que esta recibirá el valor de factor y al salir del ciclo for la imprimirá, esto, debido a que en la forma que se creó el contador, irá del número más pequeño divisible (2) hasta el más grande que encuentre, por lo tanto, la variable bandera irá guardando cada factor primo y simplemente se quedará con el último valor arrojado por la última división.
Nota:
Si solo se imprimiera la variable factor en lugar de bandera, aún volvería a entrar al ciclo, por lo cual, el valor se vería afectado aumentando en 1, es por eso que se usó la variable bandera.
Código JAVA:
public class problematres {
public static void main (String[] args){
long numero = 600851475143l;
int factor, bandera= 0;
for(factor=2; factor<=numero; factor++) {
while (numero%factor==0){
System.out.println(numero + " | " + factor); //LÍNEA OPCIONAL
numero/=factor;
bandera = factor;
}
}
System.out.println("el factor más grande es: " + bandera);
}
}
Código RUBY:
En Ruby tuve que modificar un poco el código, debido a que no sé qué tipo de magia negra estaba escribiendo, que no salía del ciclo for, es decir, al llegar al último factor, se quedaba estancado y no mostraba la impresión del factor, así que después use ese if para compararlo y si número y factor son iguales, quiere decir que llegó al máximo y lo imprime. (Mientras descubro por qué no corre de la otra manera)
numero = 600851475143
bandera = 0
for factor in(2..numero)
if numero == factor
bandera = factor
puts "El número más grande es: #{bandera}"
break
end
while numero%factor == 0 do
numero/=factor
end
end
Problema 4:
Un número palíndromo se lee igual en ambos sentidos. El número más grande formado por la multiplicación de 2 números de 2 dígitos es 9009 = 91 x 99.
Encuentra el palíndromo más grande hecho por la multiplicación de 2 números de 3 dígitos.
Encuentra el palíndromo más grande hecho por la multiplicación de 2 números de 3 dígitos.
Solución a partir de dos ciclos for y while:
Hasta ahora, el problema que más me he demorado, ya que quise resolverlo con total fuerza bruta (muy bruta) y sin recurrir a librerías para automatizar o usar un string para transformar los valores en cadenas. Simplemente a través de comparaciones y ciclos.
Sí, la idea es después mejorarlo para simplificar el código, agilizar el proceso etc, etc, etc...
(Como siempre, se aceptan contribuciones =} )
1.- Se declaran las variables a ocupar como tipo long debido a los valores que manejaremos, inicial nos servirá como valor de la multiplicación, comparacion será al que aplicaremos el algoritmo de palíndromo, reverso será la variable inicial invertida, y las variables temp y mayor nos ayudarán a definir el palíndromo de mayor valor.
2.- Inician dos ciclos for, uno dentro del otro, esto permite crear los valores de 3 cifras a multiplicar, las variables van en decremento, con el fin de mejorar el código comenzando con los números más grandes y así encontrar más rápido el mayor palíndromo sin tener que multiplicar todos los valores (por ahora no implementado y hace la multiplicación total). Lo que estaría generando, es una multiplicación del primer valor de i por todos los valores de j, es decir 999 x 999 | 999 x 998 | 999 x 997 ...
3.- La variable inicial hace la operación antes mencionada, luego, la variable comparacion toma el valor de inicial y se asigna el valor de 0 para poder usar la variable reverso.
4.- Comienza el ciclo while con la condición de que mientras comparacion sea mayor que 0, seguirá dividiéndose para encontrar su valor invertido, es por eso que se creó esta variable comparacion, debido a que al final del ciclo, tendrá un valor de 0, y es importarte guardar el valor original (contenido en inicial) para poder compararlo.
5.- La variable reverso tendrá como resultado su valor actual por 10, más el residuo de comparacion entre 10, y comparacion después tendrá el valor de dividirse a sí misma entre diez. De esta manera, se irá "quitando" el último número de la variable comparacion y se irá agregando al lado de reverso de izquierda a derecha. El ejemplo sería así tomando en cuenta los valores iniciales.
inicial = 1234
reverso = 0 * 10 + 1234%10 = 0 + 4 = 4
comparacion = 1234 / 10
.:
reverso = 4
comparacion = 123
-------
reverso = 4 * 10 + 123%10 = 40 + 3 = 43
comparacion = 12
.:
reverso = 43
comparacion = 12
Así sucesivamente.
6.- Se hacen las dos condiciones que darán el resultado buscado. El primer if comparará el valor resultante de la variable comparacion con el de inicial, si ambos son iguales, entonces sabemos que es un palíndromo, así que entrará el segundo if que comparará el valor de temp con inicial. Si temp es mayor, la variable mayor tomará su valor, caso contrario, la variable mayor tomará el valor de inicial y también la variable temp tomará ese valor, así iría comparando y solo guardando el valor más alto, para finalmente imprimirla al salir de los ciclos for.
Código JAVA:
public class problemacuatro {
public static void main(String[] args) {
long inicial, comparacion, reverso, temp = 0, mayor = 0;
for (int i = 999; i >= 100; i--) {
for (int j = 999; j >= 100; j--) {
inicial = i * j;
comparacion = inicial;
reverso = 0;
while (comparacion > 0) {
reverso = reverso * 10 + comparacion % 10;
comparacion /= 10;
}
if (inicial == reverso) {
if (temp > inicial) {
mayor = temp;
} else {
mayor = inicial;
temp = inicial;
}
}
}
}
System.out.println("El mayor palíndormo es: " + mayor);
}
}
Código RUBY:
Usando dos upto para generar los números, luego la variable pal para hacer la operación, y finalmente, usando las noblezas de Ruby (aunque me parece que en java podría hacerse lo mismo, pero obvio son inútil y ahí no pude) se guardan los resultados en un arreglo y después el método max es encargado de recoger el valor más alto dentro del arreglo:
mayor = 0
100.upto(999){ |numero1|
100.upto(999){ |numero2|
pal = numero1 * numero2
if pal.to_s == pal.to_s.reverse
mayor = [mayor, pal].max
end
}
}
puts mayor
No hay comentarios:
Publicar un comentario