Números amigos en Java

Comprobar si dos números son amigos

Dos números enteros positivos A y B son números amigos si la suma de los divisores propios de A es igual a B y la suma de los divisores propios de B es igual a A.

Los divisores propios de un número incluyen la unidad pero no el propio número.

Un ejemplo de números amigos son los números 220 y 284.
Los divisores propios de 220 son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110.
La suma de los divisores propios de 220 da como resultado 284
Los divisores propios de 284 son 1, 2, 4, 71 y 142.
La suma de los divisores propios de 284 da como resultado 220.
Por lo tanto 220 y 284 son amigos.

Otras parejas de números amigos son:

 1184,   1210
 2620,   2924
 5020,   5564
 6232,   6368
10744, 10856
12285, 14595
17296, 18416

Vamos a escribir el programa que calcula si dos números son amigos:
import java.util.*;
/**
 * Programa Java que determina si dos números son amigos.
 * Dos números son amigos si la suma de los divisores propios del primero
 * es igual al segundo y viceversa.
 */
public class NumerosAmigos {

    public static void main(String[] args) {
 
        int i,suma=0, n1, n2;
        Scanner sc = new Scanner(System.in);
        System.out.print("Introduce primer número: ");
        n1 = sc.nextInt();
        System.out.print("Introduce segundo número: ");
        n2 = sc.nextInt();
  
        for(i = 1;i < n1;i++){  // for para sumar todos los divisores propios de n1                                   
             if(n1%i==0){
                suma=suma+i;
             }
        }
  
        // si la suma de los divisores de n1 es igual a n2
        if(suma==n2){
           suma=0;
           for(i = 1;i < n2;i++){  // sumo los divisores propios de n2                                                
                if(n2%i==0){
                   suma=suma+i;
                }
            }
           //si la suma de los divisores de n2 es igual a n1
           if(suma==n1){
              System.out.println("Son Amigos");
           }else{
              System.out.println("No son amigos");
           }
        }        
        else{
             System.out.println("No son amigos");
        }
    }
}

21 comentarios:

  1. Excelente aporte y super explicado

    ResponderEliminar
  2. muy bueno hermano, gracias y bendiciones

    ResponderEliminar
  3. Disculpa con ese código me dio que 3 y 4 son Amigos, lo puedes corroborar porfa.

    ResponderEliminar
    Respuestas
    1. Si introduces 3 y 4 el programa te dice que no son amigos. Revisa el código que estás usando por si has cambiado alguna llave de lugar

      Eliminar
  4. Hola , Enrique,
    Muchas gracias por este ejercicio, me sirvio de mucho!
    Pero aprovecho para ver si te puedo hacer una consulta. Resulta que yo soy novato en programacion java, bueno... al principio yo estaba intentando hacer este ejercicio con un do \while, es muy poco lo que llevo, pero al momento queria probar si mi acumulador de divisores esta bien formulado me di cuenta que me esta dando un numero totalmente diferente, no se porque, no se si estoy utilizando bien el do/ while o si es mas una cosa del if, aqui te dejo un ejemplo, si tiene tiempo para que lo revise y me pueda dar un idea o direccion de como solucionar el algoritmo utilizando el do / while en lugar del for. no estoy menospreciando tu trabajo , de lo contrario estoy muy agradecido de haber encontrado algo asi. de seguro me sirve como idea para lo que me falta por desarrollar pero al momento no me esta funcionado los acumuladores de divisores
    |
    |
    v

    public static void main(String[] args) {


    Scanner teclado = new Scanner(System.in);
    int num1 = 0;
    int num2 = 0;
    int i = 0;
    int TotalSumaDivisores = 0 ;
    System.out.println("digite un numero");
    num1 = teclado.nextInt();


    do {
    i++;
    if( num1 % i==0){

    TotalSumaDivisores = TotalSumaDivisores + i ;

    }




    }while (i<num1);

    System.out.println(""+ TotalSumaDivisores);

    ResponderEliminar
    Respuestas
    1. Hola, lo que está pasando es que estás dividiendo también por el propio número y lo estás sumando al acumulador de divisores. Debes comprobar que i < num1 para poder realizar la operación:
      num1 % i == 0
      Saludos

      Eliminar
    2. import java.util.*; //Añade utilidades a nuestro código

      public class MyClass {
      public static void main(String args[]) {
      Scanner lector = new Scanner(System.in); //Utilidad de interacción

      System.out.println("Ingresá un número:"); //Utilidad para escribir en pantalla
      int n1 = lector.nextInt(); //nextInt recupera un valor entero desde teclado
      lector.nextLine(); //lee el "enter" al ingresar un numero

      int f = 0,d = 0; // operaciones logicas
      int c = 0,c1 = 0; //contadores
      do{

      f = n1 - 1;
      c = c + 1;
      d = n1 % c;
      if (d == 0){
      c1 = c1 + c;
      }
      }while (c != f);

      System.out.println("Ingresá otro número:"); //Utilidad para escribir en pantalla
      int n2 = lector.nextInt(); //nextInt recupera un valor entero desde teclado
      lector.nextLine(); //lee el "enter" al ingresar un numero

      int f1 = 0,d1 = 0;// operaciones logicas
      int c2 = 0,c3 = 0; //contadores
      do{

      f1 = n2 - 1;
      c2 = c2 + 1;
      d1 = n2 % c2;
      if (d1 == 0){
      c3 = c3 + c2;
      }
      }while (c2 != f1);

      if (c1 == n2){
      if (c3 == n1){
      System.out.println("El numero: " + n1 + " y el numero: " + n2 + " son numeros amigos");
      }else{
      System.out.println("El numero: " + n1 + " y el numero: " + n2 + " no son numeros amigos");
      }
      }else{
      System.out.println("El numero: " + n1 + " y el numero: " + n2 + " no son numeros amigos");
      }
      }
      }

      Eliminar
  5. package comprobarcodigo;
    import java.util.Scanner;
    public class Comprobarcodigo {
    public static void main(String[] args) {

    int n1,n2,sumaN1=0,sumaN2=0;
    int div;
    Scanner entrada = new Scanner(System.in);

    System.out.printf("%s\n","Bienvenido, ingresa dos numeros para saber si son amigos");
    System.out.printf(" %s\n%s\n%s\n","Dos números enteros positivos A y B son números amigos si"," la suma de los divisores propios de A es igual a B"," y la suma de los divisores propios de B es igual a A.");
    System.out.printf("\t%s\n","Por ejemplo 220 y 284 son amigos");
    n1 = entrada.nextInt();
    n2 = entrada.nextInt();

    for(div=1;div<n1;div++){
    if(n1 % div ==0){
    sumaN1 = sumaN1+div;
    }
    }
    for(div=1;div<n1;div++){
    if(n2 % div ==0){
    sumaN2 = sumaN2+div;
    }
    }
    if(sumaN1==n2 && sumaN2==n1){
    System.out.println("Son numeros amigos");
    }
    else{
    System.out.println("no son numeros amigos");
    }
    }
    }

    ResponderEliminar
  6. Si quisiera implementar un metodo para cada numero como lo podria hacer me puedes ayudar con una guia de eso soy nuevo en la materia. Saludos

    ResponderEliminar
  7. public static void main (String[] args)throws IOException
    {
    BufferedReader tecla=new BufferedReader(new InputStreamReader(System.in));
    int N, I=0;
    System.out.println(" INVERTIR CIFRA");
    System.out.println(" -------- -----");
    System.out.print(" NUMERO : ");
    N = Integer.parseInt(tecla.readLine());
    while (N > 0)
    {
    I = I * 10 + N % 10;
    N = N / 10;
    }
    System.out.println(" INVERTIDO : " + I);
    }
    }

    ResponderEliminar
  8. //para los que estan aprendiendo a programar en c# con ventanas ya la ise gracias estaba fallando en algunas cosas saluds
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace WindowsFormsApplication7
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    int a, b, suma = 0;
    a = int.Parse(textBox1.Text);
    b = int.Parse(textBox2.Text);
    for (int i = 1; i < a; i++)
    {
    if (a % i == 0)
    suma = suma + i;
    }
    if (suma == b) {

    suma = 0;


    for (int i = 1; i < b; i++)
    {
    if (b % i == 0)
    suma = suma + i;

    }
    }

    if (suma == a)
    listBox1.Items.Add("los numeros " + a + " y " + b + "si son amigos");
    else
    listBox1.Items.Add("los numeros "+ a +" y "+ b +"no son amigos");


    }
    }
    }

    ResponderEliminar
  9. Mas cortito y lo entiendo mejor =D gran blog me entusiasma hacer estos ejercicios

    import java.util.*;

    public class Ejercicio8 {

    public static void main(String[] args){

    int n1,n2,d,suma1=0,suma2=0;

    Scanner sc = new Scanner(System.in);
    System.out.print("Introduce número 1: ");
    n1=sc.nextInt();
    System.out.print("Introduce número 2: ");
    n2=sc.nextInt();

    for(d=1;d<n1;d++){
    if(n1%d==0){
    suma1+=d;
    }
    }
    for(d=1;d<n2;d++){
    if(n2%d==0){
    suma2+=d;
    }
    }

    System.out.println(suma1==n2 && suma2==n1?"amigos":"no amigos");


    sc.close();
    }

    }

    ResponderEliminar
    Respuestas
    1. Gracias por el comentario! me alegra de que te gusten los ejercicios. De la forma que propones también está bien resuelto, solo que se siempre calculas la suma de divisores de los dos números y luego compruebas si las sumas son iguales. La suma de divisores del segundo número no es necesario hacerla si suma1 != n2.
      Un saludo y gracias por seguir el blog.

      Eliminar
  10. Hola buenos días acá hay una falla 11 y 6 son amigo
    pero el programa no nuestra solo nuestra 220 y 284 y lo demás
    yo programe de otra forma si me muestra que 6 y 11 son amigos de igual manera usando el
    el bucle for

    ResponderEliminar
  11. Como seria el mismo codigo para while

    ResponderEliminar
  12. Yo lo hice de otra manera.


    public class inicio {

    public static void main(String[] args) {

    int numeroA = 17296;
    int numeroB = 18416;

    int sumaDivisorA = 0, sumaDivisorB = 0;
    for (int i = 1; i < numeroA; i++) {
    if (numeroA % i == 0) {
    sumaDivisorA += i;
    }
    }

    if (!(sumaDivisorA == numeroB)) {
    System.out.println("Son diferentes");
    System.exit(0);
    } else {
    for (int j = 1; j < numeroB; j++) {
    if (numeroB % j == 0) {
    sumaDivisorB += j;
    }
    }

    if (sumaDivisorB == numeroA) {
    System.out.println("Son amigos");
    }
    }

    System.out.println("sumaDivisorA = " + sumaDivisorA);
    System.out.println("sumaDivisorB = " + sumaDivisorB);

    }
    }

    ResponderEliminar
  13. Hola.He realizado este ejercicio y el anterior creando los siguientes métodos.
    En el main realizo la lectura de los datos.

    public int SumaDivisores(int number){
    //algoritmo que devuelve la suma de los divisores de un número
    int sumDiv=0;
    for(int div =1;div<number;div++){
    if(number%div==0){
    sumDiv = sumDiv+div;
    }
    }
    return sumDiv;
    }

    public boolean IsPerfectNumber(int number){
    //algoritmo para comprobar si un número es perfecto.
    // Un número es perfecto si ES UN ENTERO POSITIVO Y es igual a la suma de todos sus divisores positivos sin incluir el propio número.
    //Por ejemplo, el número 6 es perfecto.
    //El 6 tiene como divisores: 1, 2, 3 y 6 pero el 6 no se cuenta como divisor para comprobar si es perfecto.
    //Si sumamos 1 + 2 + 3 = 6

    int sumDiv =0;
    if (number <=0) return false;//PERFECTO DEBE SER ENTERO POSITIVO

    sumDiv=SumaDivisores(number);
    return (sumDiv==number);

    }

    public boolean IsFriendlyNumbers(int number1, int number2){
    //Algoritmo que comprueba si dos números son amigos.
    //Los números amigos son dos números enteros positivos «a» y «b» tales que
    //la suma de los divisores (aquellos valores que dividen el número en partes exactas)
    //propios de uno es igual al otro número y viceversa. El ejemplo más conocido es el de 220 y 284.


    if(number1<=0 && number2<=0) return false;//Amigos deben ser ENTEROS POSITIVOS.

    if (SumaDivisores(number1)==number2 && SumaDivisores(number2)==number1){
    return true;
    }else{
    return false;
    }

    }

    ResponderEliminar