En ese caso lo que corresponde es realizar un programa que calcule la ecuación de Euclides para números perfectos. He estado consultando mis libros de matemáticas (los que están al fondo de mi bilioteca xD) y la ecuación es como esto:
(2^(n-1))*((2^n)-1)
para los cuatro primeros números perfectos.
Aunque no me parece la mejor forma de hacerlo ya que esa ecuación da el enécimo número perfecto y no te dice si un número es perfecto o no.
La definición de número perfecto dice que es número perfecto aquel en que la suma de sus divisores es igual al número dado. Por definición de división, los divisores son siempre menores al número dado excepto el propio número, pero este no se cuenta para la sumatoria.
Lo que nos lleva a otro problema: determinar cuáles son los divisores de un número. Otra vez, por definición, los divisores de un número son más cuanto más grande sea el número y esto implica que hay que almacenar una cantidad de datos que no conocemos (y esto sugiere que se deben usar listas dinámicas lo cual me parece demasiado avanzado para tí). Sin embargo podría encontrar un algoritmo donde no sea necesario almacenar los divisores de un número para luego hacer su sumatoria.
Estudiando mejor la definición de número perfecto llego a una conclusión suplementaria: el 1 y el 2 no pueden ser números perfectos ya que el 1 no tiene divisores (en el conjunto de los enteros) y el 2 tiene un único divisor, el 1, que evidentemente su sumatoria no da 2. Esta conclusión nos sirve para eliminar casos triviales.
Voy a escribir una pequeña función para comenzar:
function EsNumPerfecto(numero: Longint): boolean;
var
Sum: LongInt;
I: integer;
begin
EsNumPerfecto:=false; { asumo que no es perfecto por omisión }
if (numero > 2) then
begin
Sum:=0;
for i:=(numero - 1) downto 2 do { for regresivo }
if (numero mod i) = 0 then sum:=sum+i; { si el resto de la división es cero, entonces es divisor por lo tanto hay que sumarlo }
if Sum = Numero then EsNumPerfecto:=true; { si la sumatoria es igual al número evaluado, entonces es Número Perfecto }
end; { if }
end; { EsNumPerfecto }
Estoy seguro que este algoritmo se puede mejorar pero por amor a la claridad lo dejo como está.
Habiendo escrito una función que nos diga si un número es perfecto o no, podemos escribir las partes que nos faltan.
El ejercicio dice que los números a evaluar están en un archivo ¿de texto?, vamos a suponer que sí, y que cada línea del archivo contiene un solo número. Hay que leer ese archivo línea por línea.
program EsPerfecto;
uses crt;
var
Arch: Text;
Linea: string;
Numero: LongInt; { el número a evaluar }
C: integer; { auxiliar }
function EsNumPerfecto(num: Longint): boolean;
var
Sum: LongInt;
I: integer;
begin
EsNumPerfecto:=false; { asumo que no es perfecto por omisión }
if (num > 2) then
begin
Sum:=0;
for i:=(num - 1) downto 2 do { for regresivo }
if (num mod i) = 0 then sum:=sum+i; { si el resto de la división es cero, entonces es divisor por lo tanto hay que sumarlo }
if Sum = Num then EsNumPerfecto:=true; { si la sumatoria es igual al número evaluado, entonces es Número Perfecto }
end; { if }
end; { EsNumPerfecto }
begin { principal }
Assign(Arch,'numeros.txt');
Reset(Arch);
while not Eof(Arch) do { mientras no sea fin de archivo... }
begin
ReadLn(Arch, Linea); { ...leer una línea del archivo }
Val(Linea, Numero, C); { convierte un string a integer/longint }
if C = 0 then
begin
if EsNumPerfecto(Numero) then
WriteLn('El número ',Numero,' es número perfecto.')
else
WriteLn('El número ',Numero,' NO es número perfecto.')
end
else WriteLn('El número ',Linea,' no es un número válido.');
end; { while }
Close(Arch);
end.
Para poner en ejecución este programa debes crear el archivo numeros.txt donde cada línea del archivo sea un número dentro del rango de los LongInt.
Coméntame lo que no entiendas...