type ListSimple = class l := new List<int64>(); procedure AddSimple(N: int64); begin var Result := True;
var num := n; while num > 0 do begin if not (num mod 10 in [2,3,5,7]) then begin Result := False; break; end; num := num div 10; end; if not Result then exit;
for var i: int64 := 2 to round(sqrt(N)) do if N mod i = 0 then begin Result := False; break; end; // lock не позволяет нескольким потокам одновременно выполнять эту секцию. // Это обязательно, иначе если несколько потоков одновременно будут пытаться добавить значение в список, список может оказаться испорченным // Секция, охраняемая lock, называется критической lock l do if Result then l.Add(N); end; end;
var hh := 100000;
begin var ls := new ListSimple; var ii: int64 := 2;
Parallel.For(ii, ii + hh, ls.AddSimple); writeln(ls.l.Count); ls.l := ls.l.OrderBy(x->x).ToList(); //- это можно включить для проверки того, что в обоих списках - одинаковые простые числа for var i := 0 to ls.l.Count - 1 do writeln(i+1,' - ',ls.l[i]);
writeln; writeln('Время выполнения = ', Milliseconds); end.
Var i,k,n,p:longint; f:array[1..10,1..2] of longint; begin p:=2; i:=1; f[1,1]:=1; f[1,2]:=1; Write('Введите натуральное число не больше 2 147 483 647: '); Read(n); Write(n,' = 1'); while n<>1 do begin if (n mod p)=0 then begin if f[i,1]<>p then begin Inc(i); f[i,1]:=p; f[i,2]:=1 end else Inc(f[i,2]); n:=n div p end else inc(p) end; k:=i; for i:=2 to k do begin Write(' x ',f[i,1]); if f[i,2]>1 then Write('^',f[i,2]) end; Writeln end.
Тестовое решение: Введите натуральное число не больше 2 147 483 647: 223092870 223092870 = 1 x 2 x 3 x 5 x 7 x 11 x 13 x 17 x 19 x 23
Введите натуральное число не больше 2 147 483 647: 65536 65536 = 1 x 2^16
Введите натуральное число не больше 2 147 483 647: 2147483647 2147483647 = 1 x 2147483647
ответ: 4) 4В16