67 lines
1.1 KiB
ObjectPascal
67 lines
1.1 KiB
ObjectPascal
program ProperDivisors;
|
|
|
|
{$APPTYPE CONSOLE}
|
|
|
|
{$R *.res}
|
|
|
|
uses
|
|
System.SysUtils,
|
|
System.Threading,
|
|
System.SyncObjs;
|
|
|
|
type
|
|
TProperDivisors = array of Integer;
|
|
|
|
function GetProperDivisors(const value: Integer): TProperDivisors;
|
|
var
|
|
i, count: Integer;
|
|
begin
|
|
count := 0;
|
|
|
|
for i := 1 to value div 2 do
|
|
begin
|
|
if value mod i = 0 then
|
|
begin
|
|
inc(count);
|
|
SetLength(result, count);
|
|
Result[count - 1] := i;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure Println(values: TProperDivisors);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
Write('[');
|
|
if Length(values) > 0 then
|
|
for i := 0 to High(values) do
|
|
Write(Format('%2d', [values[i]]));
|
|
Writeln(']');
|
|
end;
|
|
|
|
var
|
|
number, max_count, count, max_number: Integer;
|
|
|
|
begin
|
|
for number := 1 to 10 do
|
|
begin
|
|
write(number, ': ');
|
|
Println(GetProperDivisors(number));
|
|
end;
|
|
|
|
max_count := 0;
|
|
TParallel.for (1, 20000,
|
|
procedure(I: Int64)
|
|
begin
|
|
count := length(GetProperDivisors(I));
|
|
if count > max_count then
|
|
begin
|
|
TInterlocked.Exchange(max_count, count);
|
|
TInterlocked.Exchange(max_number, I);
|
|
end;
|
|
end);
|
|
|
|
Writeln(max_number, ': ', max_count);
|
|
readln;
|
|
end.
|