Hola a todos, hoy os voy a explicar como podemos obtener el mayor divisor de un número en Java.
Puse ser que necesitemos obtener el mayor divisor de un número en Java, sin contar el propio número.
En el caso de que sea un número primo, el mayor será si mismo.
Para saber si un número es primo o no en Java, tenemos un manual donde hablamos de ello:
Lo primero que vamos a hacer es pedir un número y guardaremos en otra variable el número absoluto, para evitar problemas con negativos.
import java.util.Scanner; public class MayorDivisorJava { public static void main(String[] args) { Scanner sn = new Scanner(System.in); System.out.println("Escribe un numero"); int numero = sn.nextInt(); int numeroAbsoluto = Math.abs(numero); } }
Antes de buscar el divisor, si es primo, mostramos el número original directamente.
import java.util.Scanner; public class MayorDivisorJava { public static void main(String[] args) { Scanner sn = new Scanner(System.in); System.out.println("Escribe un numero"); int numero = sn.nextInt(); int numeroAbsoluto = Math.abs(numero); if (esPrimo(numeroAbsoluto)) { System.out.println(numero); } else { } } public static boolean esPrimo(int numero) { if (numero <= 1) { return false; } int contador = 0; //bucle que cuenta los numeros divisibles for (int i = (int) Math.sqrt(numero); i > 1; i--) { if (numero % i == 0) { contador++; } } return contador < 1; } }
Ahora, si que vamos a buscar el mayor divisor. Recorremos desde el numero dado menos 1 hasta el 1, sin contar este. Cuando encontremos el primero, saldremos del bucle y terminaremos la busqueda.
import java.util.Scanner; public class MayorDivisorJava { public static void main(String[] args) { Scanner sn = new Scanner(System.in); System.out.println("Escribe un numero"); int numero = sn.nextInt(); int numeroAbsoluto = Math.abs(numero); if (esPrimo(numeroAbsoluto)) { System.out.println(numero); } else { int mayorDivisor = 0; boolean encontrado = false; for (int i = numeroAbsoluto - 1; i > 1 && !encontrado; i--) { if (numeroAbsoluto % i == 0) { encontrado = true; mayorDivisor = i; } } } } public static boolean esPrimo(int numero) { if (numero <= 1) { return false; } int contador = 0; //bucle que cuenta los numeros divisibles for (int i = (int) Math.sqrt(numero); i > 1; i--) { if (numero % i == 0) { contador++; } } return contador < 1; } }
Por último, debemos mostrar el numero. Si el número original es negativo, lo pongo como negativo.
import java.util.Scanner; public class MayorDivisorJava { public static void main(String[] args) { Scanner sn = new Scanner(System.in); System.out.println("Escribe un numero"); int numero = sn.nextInt(); int numeroAbsoluto = Math.abs(numero); if (esPrimo(numeroAbsoluto)) { System.out.println(numero); } else { int mayorDivisor = 0; boolean encontrado = false; for (int i = numeroAbsoluto - 1; i > 1 && !encontrado; i--) { if (numeroAbsoluto % i == 0) { encontrado = true; mayorDivisor = i; } } if (numero < 0) { System.out.println(-mayorDivisor); } else { System.out.println(mayorDivisor); } } } public static boolean esPrimo(int numero) { if (numero <= 1) { return false; } int contador = 0; //bucle que cuenta los numeros divisibles for (int i = (int) Math.sqrt(numero); i > 1; i--) { if (numero % i == 0) { contador++; } } return contador < 1; } }
Veamos el resultado con diferentes números:
Si el número es primo:
También os lo dejo como una función para reutilizar en otros proyectos:
public static boolean esPrimo(int numero) { if (numero <= 1) { return false; } int contador = 0; //bucle que cuenta los numeros divisibles for (int i = (int) Math.sqrt(numero); i > 1; i--) { if (numero % i == 0) { contador++; } } return contador < 1; } public static int mayorDivisor(int numero) { int numeroAbsoluto = Math.abs(numero); // Si es primo, retornamos el numero if (esPrimo(numeroAbsoluto)) { return numero; } else { int mayorDivisor = 0; boolean encontrado = false; // Empiezo desde el numero hasta el 1 for (int i = numeroAbsoluto - 1; i > 1 && !encontrado; i--) { // Compruebo si es divisible if (numeroAbsoluto % i == 0) { encontrado = true; mayorDivisor = i; } } // Segun si es negativo o no el número if (numero < 0) { return -mayorDivisor; } else { return mayorDivisor; } } }
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Math.sqrt(numero);, QUE PINTA LA RAÍZ CUADRADA, TU ESTÁS SEGURO QUE ESTO FUNCIONA?, A MI ME DA QUE NO. HAZ TESTING CON DIFERENTES POSIBILIDADES: NÚMEROS GRANDES, NÚMEROS NO PRIMOS, ETC.
Lo de math.sqrt es para sacar la raíz cuadrada, en este caso es de utilidad porque un divisor no será mayor que su raíz cuadrada y te evita recorrer una cantidad de números que sabes que no pueden ser divisores.