Calcular numeros amigos en JAVA

Como siempre digo, antes de empezar a escribir código, es muy importante tener bien claro lo que significa que dos números sean amigos, al igual que con cualquier otro ejercicio. De esta manera, dos números a y b son amigos, si a es la suma de los divisores propios de b y b es la suma de los divisores propios de a teniendo en cuenta que 1 si cuenta como divisor de un número, pero el mismo numero no es un divisor válido, es decir 1 es divisor de 100, pero 100 no lo es de 100.


Teniendo bien claro el significado de este problema, a continuación podéis ver el código, si encontráis alguna manera de optimizarlo comentad y lo modificaré ;).
public class Amigos {

    public static void main(String[] args) {
        int limite = 3000;

        for (int i = 1; i < limite; i++) {
            for (int j = 1; j < limite; j++) {
                if (i < j && sumaDivisores(i) == j 
                                  && sumaDivisores(j) == i) {
                    System.out.println(i + " y " + j + " son amigos.");
                }
            }
        }
    }

    public static int sumaDivisores(int n) {
        int suma = 0;
        for (int i = 1; i < n / 2 + 1; i++) {
            if (esDivisor(n, i)) {
                suma += i;
            }
        }
        return suma;
    }

    public static boolean esDivisor(int n, int prueba) {
        return n % prueba == 0;
    }
}

Comentarios

  1. ta bueno no sabia esa baina de numero amigos :O

    ResponderEliminar
  2. hOLA DISCULPA ME PUEDES EXPLICAR XQ EN EL METODO USAS N/2?

    ResponderEliminar
    Respuestas
    1. Hola, esa es una pequeña optimización. Lo que el método esta haciendo es buscando posibles divisores del parámetro "n" de modo que debemos probar todos los numeros desde el 1, hasta "n" menos 1.

      La optimización se basa en que como ningún numero se puede dividir entre la mitad de su valor siendo el resto 0, por ejemplo, 20 se puede dividir entre 1, 2, 4, 5 y 10. Como ves, 10 es 20/2 y es el último divisor posible de modo que no es necesario seguir probando con 11, 12, 13...

      El +1 está para cubrir posibles problemas con divisiones no enteras, por ejemplo si queremos buscar divisores de 25, comprobaremos hasta el 25/2 = 12.5 que será truncado a 12 ya que es un int, de modo que se suma 1 para comprobar hasta 13.

      Eliminar
  3. Pues si lo podrias hacer con el ingreso de la cantidad de parejas q quiero buscar seria de mucha ayuda

    ResponderEliminar

Publicar un comentario

Si tenéis alguna duda o sugerencia, no dudéis en comentar. ;)

Entradas populares de este blog

Autocompletado de codigo en Sublime Text

Compilar y ejecutar JAVA desde Notepad++

Compilar y ejecutar JAVA desde Sublime Text