Obtener el mayor divisor de un número en Java

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:

Número primo en Java

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:

mayor divisor java 1

mayor divisor java 2

Si el número es primo:

mayor divisor java 3

mayor divisor java 4

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.

Compartir

2 comentarios

  1. POLLO

    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.

  2. Disco Duro de Roer Post author

    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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *