Programa de la suma de dos divisores

Hola, me piden un programa en pascal donde el usuario proporcione dos números enteros y la suma de los divisores del primer valor "a" es igual a "b" y la suma de los divisores de "b" es igual a "a", además debe llevar un procedimiento. Ayuda, por fa. :)

1 Respuesta

Respuesta
1

·

El enunciado es contradictorio creo.

Si el usuario introduce los dos números el programa podrá decirte si la suma de los divisores de uno es el otro o no lo es, pero no podrá hacer que sean iguales.

Si lo que quieres es encontrar números que cumplan eso (que por cierto se llaman números amigos) tendrás que hacer un programa que compare divisores de números hasta cierto límite (por razones de tiempo) y que te saque la lista de los que haya obtenido.

·

Recapacita y dime exactamente lo que debe hacer el programa.

Hola! 

Bueno pues en si tienes más o menos razón el programa en si debe sacar si dos números son amigos o no, pero si es necesario que el usuario proporcione dichos números. 

Saludos.

Hubiera sido más interesante el que busca números amigos, pero vamos a hacer este. La suma de divisores es bastante importante en la Teoría de Números, donde tiene una fórmula que pasa por su descomposición en factores primos. Pero aquí vamos a hacerlo más simple, probando divisores y sumando los que lo sean. Toda esta teoría esta basada en que se entiende por suma la de todos los divisores incluido el 1 pero no el número proipio. Por ejemplo la suma de divisores de 12 es

1+2+3+4+6 = 16

Para ahorrar pruebas debemos darnos cuenta de que si encontramos un divisor hemos encontrado otro ya que si d divide a n entonces n/d divide a d, luego van por pares como

2y6, 3y4 salvo en estos dos casos:

El 1 no tiene par

Si un número es un cuadrado perfecto entonces el divisor que es la raíz cuadrada sale una vez solo sin ningún par.

Para probar un par de números que son amigos prueba con 220 y 284

Y el programa que hace los cálculos hecho con Lazarus Free Pascal es este:

program NumerosAmigos;
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };
var
  a,b,sa,sb: integer;
  otro: char;
procedure SumaDivisores(n:integer; var s:integer);
var i, rn:integer;
begin
     rn:=trunc(sqrt(n));
     s:=1;
     for i:= 2 to rn do
         if (n mod i=0) then
            begin
                 s:=s+i;
                 if i*i <>n then
                    s:=s+n div i;
            end;
end;
begin
     repeat
         repeat
               write('Primer numero:  ');
               readln(a);
         until a>1;
         repeat
               write('Segundo numero: ');
               readln(b);
         until b>1;
         writeln;
         SumaDivisores(a,sa);
         SumaDivisores(b,sb);
         if (a=sb) and (b=sa) then
             begin
                  writeln('Los numeros son amigos.');
                  writeln('Los divisores de ',a,' suman: ', sa);
                  writeln('Los divisores de ',b,' suman: ', sb);
             end
         else
             begin
                  writeln('No son amigos.');
                  writeln('Los divisores de ',a,' suman: ', sa);
                  writeln('Los divisores de ',b,' suman: ', sb);
             end;
         writeln;
         write('Otra ejecucion (S/N): ');
         readln(otro);
         writeln;
     until (otro<>'S') and (otro<>'s') ;
end.

Muchas gracias! Está bastante claro, fue de mucha ayuda.

Ahora que lo veo podría haber sido más apropiado usar una función que un procedimiento, la función sería de n y entregaría el valor s, por lo demás haría lo mismo que el procedimiento.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas