38 lines
867 B
Text
38 lines
867 B
Text
program smith_numbers;
|
|
loop for s in [n : n in [2..9999] | smith(n)] do
|
|
putchar(lpad(str s, 5));
|
|
if (i +:= 1) mod 16=0 then print; end if;
|
|
end loop;
|
|
print;
|
|
|
|
proc smith(n);
|
|
facs := factors(n);
|
|
return #facs /= 1 and +/digits(n) = +/[+/digits(f) : f in facs];
|
|
end proc;
|
|
|
|
proc digits(n);
|
|
d := [];
|
|
loop while n > 0 do
|
|
d with:= n mod 10;
|
|
n div:= 10;
|
|
end loop;
|
|
return d;
|
|
end proc;
|
|
|
|
proc factors(n);
|
|
f := [];
|
|
loop while even n do
|
|
n div:= 2;
|
|
f with:= 2;
|
|
end loop;
|
|
d := 3;
|
|
loop while d <= n do
|
|
loop while n mod d = 0 do
|
|
n div:= d;
|
|
f with:= d;
|
|
end loop;
|
|
d +:= 2;
|
|
end loop;
|
|
return f;
|
|
end proc;
|
|
end program;
|