求一定值内的质数——

发布时间 2023-08-25 05:17:41作者: RulesOS
 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;