42 lines
996 B
Text
42 lines
996 B
Text
perfect_search: procedure options (main);
|
|
|
|
%replace
|
|
search_limit by 10000,
|
|
true by '1'b,
|
|
false by '0'b;
|
|
|
|
dcl (k, found) fixed bin;
|
|
|
|
put skip list ('Searching for perfect numbers up to ');
|
|
put edit (search_limit) (f(5));
|
|
found = 0;
|
|
do k = 2 to search_limit;
|
|
if isperfect(k) then
|
|
do;
|
|
put skip list(k);
|
|
found = found + 1;
|
|
end;
|
|
end;
|
|
put skip list (found, ' perfect numbers were found');
|
|
|
|
/* return true if n is perfect, otherwise false */
|
|
isperfect: procedure(n) returns (bit(1));
|
|
|
|
dcl (n, sum, f1, f2) fixed bin;
|
|
|
|
sum = 1; /* 1 is a proper divisor of every number */
|
|
f1 = 2;
|
|
do while ((f1 * f1) <= n);
|
|
if mod(n, f1) = 0 then
|
|
do;
|
|
sum = sum + f1;
|
|
f2 = n / f1;
|
|
/* don't double count identical co-factors! */
|
|
if f2 > f1 then sum = sum + f2;
|
|
end;
|
|
f1 = f1 + 1;
|
|
end;
|
|
return (sum = n);
|
|
end isperfect;
|
|
|
|
end perfect_search;
|