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.