1 uses
2 System.SysUtils,
3 System.Generics.Collections,
4 System.Classes;
5
6 function ElementInDataDivides(data: TList<Integer>; value: Integer): boolean;
7 var
8 i: Integer;
9 begin
10 Result := True;
11 for i in data do
12 if (value <> i) and ((value mod i) = 0) then
13 Exit;
14 Result := False;
15 end;
16
17 function Reverse(s: string): string;
18 var
19 ch: char;
20 begin
21 Result := '';
22 for ch in s do
23 Result := ch + Result;
24 end;
25
26 function Filter(list: TList<Integer>): TArray<Integer>;
27 var
28 i: Integer;
29 reversed: Integer;
30 begin
31 SetLength(Result, 0);
32 for i in list do
33 begin
34 reversed := StrToInt(Reverse(IntToStr(i)));
35 if not ElementInDataDivides(list, reversed) then
36 begin
37 SetLength(Result, Length(Result) + 1);
38 Result[High(Result)] := i;
39 end;
40 end;
41 end;
42
43 function SlowMethod(highBound: Integer): TArray<Integer>;
44 var
45 i: Integer;
46 temp: TList<Integer>;
47 begin
48 temp := TList<Integer>.Create;
49 try
50 for i := 2 to highBound do
51 if not ElementInDataDivides(temp, i) then
52 temp.Add(i);
53 Result := Filter(temp);
54 finally
55 FreeAndNil(temp);
56 end;
57 end;
58
59 procedure ShowElements(data: TArray<Integer>);
60 var
61 i: integer;
62 begin
63 for i in data do
64 Write(i, ' ');
65 Writeln;
66 end;
67
68 procedure Test;
69 var
70 data: TArray<Integer>;
71 highBound: Integer;
72 begin
73 repeat
74 Writeln('How many numbers (0 to exit)?');
75 Write('> ');
76 Readln(highBound);
77 if highBound = 0 then
78 Exit;
79
80 data := SlowMethod(highBound);
81 ShowElements(data);
82 until false;
83 end;