RosettaCodeData/Task/Perfect-numbers/PL-I-80/perfect-numbers.pli
2023-07-01 13:44:08 -04:00

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;